数据结构作业(2)

A 统计回文子串

暴力方法\(O(n^3)\)都会,这里介绍几种不一样的

(1)动态规划

\(dp[i][j]\)表示子串\(s[i,j]\)是否为回文串:

  • \(i=j\)时,\(s[i,i]\)是回文子串,\(dp[i][i]=1\)
  • \(j-i=1\)时,\(dp[i][j]\)取决于\(s[i]\)是否等于\(s[j]\)
  • \(j-i>1\)时,若\(s[i]=s[j]\)\(dp[i][j]=dp[i+1][j-1]\),否则\(dp[i][j]=0\)
    根据转移的方向可以确定遍历的方向:
    \(\displaystyle{\begin{bmatrix} O & dp[i][j] \\ dp[i+1][j-1] & O \end{bmatrix}}\)
class Solution {
public:
    int countSubstrings(string s) {
        vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));
        int result = 0;
        for (int i = s.size() - 1; i >= 0; i--) {  // 注意遍历顺序
            for (int j = i; j < s.size(); j++) {
                if (s[i] == s[j]) {
                    if (j - i <= 1) { // 情况一 和 情况二
                        result++;
                        dp[i][j] = true;
                    } else if (dp[i + 1][j - 1]) { // 情况三
                        result++;
                        dp[i][j] = true;
                    }
                }
            }
        }
        return result;
    }
};
posted @ 2025-06-10 16:36  _P_D_X  阅读(16)  评论(0)    收藏  举报