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

回文子串-动态规划解法

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;
    }
};
  • 结果如图
相关推荐
信奥卷王7 小时前
[GESP202609 六级] 分树规划
算法
夏幻灵7 小时前
LeetCode 21:合并两个有序链表——双指针与哑节点详解
算法·leetcode·链表
徐小黑ACG9 小时前
Golang 基础05 结构体struct
开发语言·算法·golang
Navigator_Z9 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode
北极有牛10 小时前
cpp学习笔记--常量指针
java·开发语言·算法
GPU实战笔记10 小时前
云端 GPU 训练的账户余额提醒:它能说明什么,不能说明什么?
深度学习·算法·成本管理·gpu云计算·云端训练
浮链序10 小时前
怎么证明"你这个模型是偷我的"——把蒸馏变成取证工具
算法·安全·llm
小O的算法实验室10 小时前
IEEE TMC,面向异构物联网的多目标量子行为拓扑优化算法
算法
liliangcsdn11 小时前
派息率指标的应用探索和分析
大数据·算法