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

回文子串-动态规划解法

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;
    }
};
  • 结果如图
相关推荐
乐迪信息11 小时前
乐迪信息:目标检测算法+AI摄像机:煤矿全场景识别方案
人工智能·物联网·算法·目标检测·目标跟踪·语音识别
前端小L17 小时前
贪心算法专题(十):维度权衡的艺术——「根据身高重建队列」
javascript·算法·贪心算法
方得一笔17 小时前
自定义常用的字符串函数(strlen,strcpy,strcmp,strcat)
算法
Xの哲學17 小时前
Linux SMP 实现机制深度剖析
linux·服务器·网络·算法·边缘计算
wuk99818 小时前
使用PCA算法进行故障诊断的MATLAB仿真
算法·matlab
额呃呃18 小时前
二分查找细节理解
数据结构·算法
无尽的罚坐人生18 小时前
hot 100 283. 移动零
数据结构·算法·双指针
永远都不秃头的程序员(互关)18 小时前
C++动态数组实战:从手写到vector优化
c++·算法
水力魔方19 小时前
武理排水管网模拟分析系统应用专题5:模型克隆与并行计算
数据库·c++·算法·swmm
谈笑也风生20 小时前
经典算法题型之排序算法(三)
java·算法·排序算法