647. Palindromic Substrings

你快乐吗

Posted by bbkgl on January 30, 2020

近水楼台先得月

向阳花木易为春

因为个肺炎疫情,在家待了半个月了,准备开始继续刷题了,打了一周的只狼,打铁的感觉真不错23333。

说回到这道题,C++,动态规划。

回文串的题,用dp来解就是最简单和最容易理解的套路。

定义一个动态数组dp,dp[i][j]表示下标从i到j组成的子串是不是回文串,我们直接两层循环,遍历dp数组的所有值,如果s[i] == s[j]成立,会得到转移方程:

\[dp(i)(j) = \left\{ \begin{aligned} true, dp(i+1)(j-1) == true \\ false, other \end{aligned} \right.\]

然后就是注意一下:

  • 每个单字符都是一个回文子串
  • 相同字符挨在一起也是一个回文子串

思路简单,代码写的也就很简单了:

class Solution {
public:
    int countSubstrings(string s) {
        int ans = 0;
        vector<vector<bool>> dp(s.length(), vector<bool>(s.length()));
        for (int i = 0 ; i < s.length(); i++) {
            dp[i][i] = true;
            ans++;
            if (i < s.length() - 1 && s[i] == s[i + 1]) {
                dp[i][i + 1] = true;
                ans++;
            }
        }
        int l = 3;
        for (; l <= s.length(); l++) {
            for (int i = 0; i + l - 1 < s.length(); i++) {
                int j = i + l - 1;
                if (s[i] == s[j]) {
                    if (dp[i + 1][j - 1]) {
                        dp[i][j] = true;
                        ans++;
                    }
                }
            }
        }
        return ans;
    }
};