题目描述
给你一个字符串 s
,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:s = "abc"
输出:3
解释:三个回文子串: "a", "b", "c"
示例 2:
输入:s = "aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
提示:
1 <= s.length <= 1000
s
由小写英文字母组成
解答
class Solution {
public:int countSubstrings(string s) {// 这里dp数组是二维的因为要记录开始的信息,才能往后判断回文// dp[i][j] 表示 在区间[i, j]的子串是否是回文子串,若是为true,否则为false// 当s[i] != s[j]时, dp[i][j] = false;// 当s[i] == s[j]时,有如下三种情况// 1.下标i 和j同, 即同一个字符,则为true// 2.下标 i 和 j相差1,如 aa,也是true// 3.下标 i 和 j相差大于1时,就是考察dp[i + 1][j - 1]是否为true,若是,则dp[i][j] = true,否则 dp[i][j] = falseint len = s.size();vector<vector<bool>> dp(len, vector<bool>(len, false));// dp[i + 1][j - 1] 在dp[i][j] 的左下角,所以遍历顺序是从上到下,从左到右int res = 0;for(int i = len - 1; i >= 0; i--){for(int j = i; j < len; ++j){if(s[i] == s[j]){if(j - i <= 1 || dp[i + 1][j - 1]){res++;dp[i][j] = true;}}}}return res;}
};