回文子串数目--动态规划算法

回文子串-动态规划解法

LCR 020. 回文子串

给定一个字符串 s ,请计算这个字符串中有多少个回文子字符串。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:

复制代码
输入:s = "abc"
输出:3
解释:三个回文子串: "a", "b", "c"

示例 2:

复制代码
输入:s = "aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"

提示:

  • 1 <= s.length <= 1000
  • s 由小写英文字母组成

题解

这道题我们可以用动态规划进行解题

思路

  1. 定义一个二维表,i和j构成[i,j]区间,每个区间都代表一个子串

  2. 表格中每个单元都代表一个子串区间,是回文串则这个表做个标记

  3. 最终将表格填写完成,统计被标记的单元的个数

  4. 状态转移方程:

i>j->dp[i][j]=false

s[i]!=s[j]->dp[i][j]=false

s[i]==s[j] && (i==j||i+1==j)->dp[i][j]=true

s[i]==s[j]&&(i+1<j)->dp[i][j]=dp[i+1][j-1]

复制代码
 _______________________________
| \  i |     |           |      |
| j \  |  1  |           |  n   |    
|_____\|_____|___________|______|
|  1   |                        |
|______|________________________|
|      |                        |
|      |                        |
|      |                        |
|      |                        |
|______|________________________|
|  n   |                        |
|______|________________________|

代码部分

CPP 复制代码
class Solution {
public:
    int countSubstrings(string s) {
   		int len=s.size();	//统计一下这是个多长的字符串
     	vector<vector<bool>> dp(len,vector<bool>(len,false)); // 顶一个len*len的二维dp表记录回文子串
        int ret=0;	//定义一个计数器统计回文子串的个数
        for(int i=len-1;i>=0;i--)
        {
            for(int j=i;j<=len-1;j++)
            {
                if(s[i]==s[j])
                {
                    if(i==j||i+1==j)
                    {
                        dp[i][j]=true;
                    }
                    else
                    {
                        dp[i][j]=dp[i+1][j-1];
                    }
                    if(dp[i][j])
                    {
                        ++ret;
                    }
                }
           
            }
            
        }
        return ret;
    }
};
  • 结果如图
相关推荐
a1117761 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜1 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry1 小时前
LeetCode 541. 反转字符串 II
算法
Jerry2 小时前
LeetCode 344. 反转字符串
算法
搞科研的小刘选手2 小时前
【香港大学主办&IEEE出版】第六届计算机视觉、应用与算法国际学术会议(CVAA 2026)
算法·计算机视觉·应用·学术会议
Java小白笔记2 小时前
Codex config.toml配置实战指南
人工智能·算法·chatgpt·ai编程·集成学习
王老师青少年编程2 小时前
2026年6月GESP真题及题解(C++七级):消消乐
数据结构·c++·算法·真题·gesp·2026年6月
z小猫不吃鱼2 小时前
模型剪枝经典论文精读:Pruning Filters for Efficient ConvNets
算法·机器学习·剪枝
Fox爱分享4 小时前
字节二面:1000瓶酒,有一瓶是毒药,多少只老鼠可以查出来?
算法·面试·程序员
+wacyltd大模型备案算法备案4 小时前
大模型评估测试题库怎么建?风险分类、测试样本的完整方法
人工智能·算法·安全·分类·大模型·大模型备案·大模型上线登记