leetcode 647. 回文子串

2023.8.27

leetcode 647. 回文子串_第1张图片

        本题依旧是用dp算法来做,但是dp数组的定义和一般的dp题不太一样,一般是题目要求什么,dp数组就定义为什么,本题定义的是一个二维bool型数组dp,dp[i][j]的含义为:字符串s在下标为[i,j]中的子串是否为回文串。 

        然后遍历时,有两种情况:①下标i和j对应的字符不相等,此时明显不为回文串,即dp[i][j] = false; ②下标i和j对应的字符相等,此时又分为两种情况:a、下标j和i相差不超过1,即:要么是{a}要么是{a,a},此时肯定是回文串,即dp[i][j] = true;  b、下标i和j相差超过1,那么是不是回文串就取决于dp[i+1][j-1]了,即dp[i][j] = dp[i+1][j-1];  

        接下来遍历顺序也很关键。 由递推公式dp[i][j] = dp[i+1][j-1]可以看出,当前状态是依赖于左下角的状态的,即遍历顺序需要从左下往右上遍历。

        最后用一个全局变量ans维护回文串的数量即可。

        代码如下:

class Solution {
public:
    int countSubstrings(string s) {
        vector> dp(s.size(),vector(s.size(),false));
        int ans = 0;
        for(int i=s.size()-1; i>=0; i--)
        {
            for(int j=i; j

你可能感兴趣的:(leetcode专栏,leetcode,算法,职场和发展,c++,数据结构)