【LeetCode】647. 回文子串 Palindromic Substrings(C++)


题目来源:https://leetcode-cn.com/problems/palindromic-substrings

题目描述

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:

输入:“abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”
示例 2:

输入:“aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”

提示:

输入的字符串长度不会超过 1000 。

题目大意

  • 经典动态规划题
  • 可以思考一下,假设当某一子串已经是回文串,此时若将子串进行扩张,扩张后的子串是回文串的充要条件子串是回文串且子串的两个端点字符相等(此处无需用双指针重新比较回文串,是因为原子串已满足)
  • 状态方程如下,当i≥j的时候为True,此处其实可以不看i>j的情况,从最小的子问题,单个字符(s[0]或s[s.length()-1]都可以)组成的字符串为回文串开始处理,再逐渐扩展到F(0,s.length())
  • 方程中F(i,j)表示原字符串中下标i到j所对应的子串
    F ( i , j ) = { T r u e i ≥ j F ( i + 1 , j − 1 ) & & ( s [ i ] = = s [ j ] ) i < j F(i,j)= \left \{ \begin{array} {c}True{\quad}i≥j \\F(i + 1, j - 1)\&\&(s[i]==s[j]){\quad}i<j \end{array} \right. F(i,j)={ TrueijF(i+1,j1)&&(s[i]==s[j])i<j

动态规划

  • 记录满足回文子串此时的i和j,在构建dp数组的时候i和j不会相等,题目中允许单个字符成字符串且只要下标不同也算故需要加个判断if(dp[i][j])
class Solution {
    
    
public:
    int countSubstrings(string s) {
    
    
        int cnt = 0, len = s.size();
        vector<vector<bool>> dp(len, vector<bool>(len, true));
        
        for(int i = len - 1 ; i >= 0 ; --i){
    
    
            for(int j = i + 1 ; j < len ; ++j){
    
    
                dp[i][j] = (dp[i + 1][j - 1] && s[i] == s[j]);
                if(dp[i][j])	++cnt;
            }
            if(dp[i][i])	++cnt;
        }
        return cnt;
    }
};

复杂度分析

  • 时间复杂度:O(n^2)。n为数组的长度
  • 空间复杂度:O(n^2)。n为数组的长度,维护了一个dp布尔类型的二维数组

中心扩展

  • 数组的长度为n,生成中心点的个数为2*n-1(n个单个数和n-1个双连续数)
    在这里插入图片描述
class Solution {
    
    
public:
    int countSubstrings(string s) {
    
    
        int len = s.size();
        int count = 0;
        for (int i = 0 ; i < 2 * len - 1 ; ++i){
    
    
            int l = i / 2, r = i / 2 + i % 2;
            while (l >= 0 && r < len && s[l] == s[r]) {
    
    
                --l;
                ++r;
                ++count;
            }
        }

        return count;
    }
};

复杂度分析

  • 时间复杂度:O(n^2)。n为数组的长度
  • 空间复杂度:O(1)。

猜你喜欢

转载自blog.csdn.net/lr_shadow/article/details/115009190