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

回文子串-动态规划解法

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;
    }
};
  • 结果如图
相关推荐
南境十里·墨染春水18 小时前
C++ 工厂模式:从入门到进阶,彻底掌握对象创建的艺术
开发语言·c++·算法
@insist12318 小时前
系统架构设计师-实时性评价、调度算法与内核架构选型
算法·架构·系统架构·软考·系统架构设计师·软件水平考试
workflower20 小时前
使用大语言模型处理用户需求
大数据·人工智能·设计模式·重构·动态规划
一只齐刘海的猫1 天前
【Leetcode】找到字符串中所有字母异位词
算法·leetcode·职场和发展
海清河晏1111 天前
数据结构 | 八大排序
数据结构·算法·排序算法
IronMurphy1 天前
【算法五十七】146. LRU 缓存
算法·缓存
凌波粒1 天前
LeetCode--108.将有序数组转换为二叉搜索树(二叉树)
算法·leetcode·职场和发展
liulilittle1 天前
KCC:在 BBR 思路上的一次探索
网络·tcp/ip·算法·bbr·通信·拥塞控制·kcc
浦信仿真大讲堂1 天前
达索系统SIMULIA Abaqus 2026接触和约束的增强新功能介绍
人工智能·python·算法·仿真软件·达索软件