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

回文子串-动态规划解法

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;
    }
};
  • 结果如图
相关推荐
我家大宝最可爱40 分钟前
强化学习基础-拒绝采样
人工智能·算法·机器学习
YuTaoShao2 小时前
【LeetCode 每日一题】面试题 17.12. BiNode
算法·leetcode·深度优先
刘大猫.2 小时前
XNMS项目-拓扑图展示
java·人工智能·算法·拓扑·拓扑图·节点树·xnms
夏鹏今天学习了吗4 小时前
【LeetCode热题100(95/100)】寻找重复数
算法·leetcode·职场和发展
TTGGGFF7 小时前
控制系统建模仿真(四):线性控制系统的数学模型
人工智能·算法
晚风吹长发7 小时前
初步了解Linux中的命名管道及简单应用和简单日志
linux·运维·服务器·开发语言·数据结构·c++·算法
Σίσυφος19008 小时前
Halcon中霍夫直线案例
算法
Anastasiozzzz8 小时前
leetcode力扣hot100困难题--4.俩个正序数列的中位数
java·算法·leetcode·面试·职场和发展
BHXDML8 小时前
第六章:推荐算法
算法·机器学习·推荐算法
Tisfy9 小时前
LeetCode 3510.移除最小数对使数组有序 II:有序集合
算法·leetcode·题解·设计·有序集合