给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:"abc"
输出:3
解释:三个回文子串: "a", "b", "c"
示例 2:
输入:"aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
提示:
输入的字符串长度不会超过 1000
解答
暴力求解,从字符串的每个字符开始遍历,分别往左右扩展:
class Solution {
public:
int sum = 0;
int countSubstrings(string s) {
for(int i=0;i<s.length();i++){
// 字串长度为奇数或偶数
helper(s, i, i);
helper(s, i, i+1);
}
return sum;
}
void helper(string s, int start, int end){
while(start>=0 && end <s.length() && s[start]==s[end]){
sum++;
start--;
end++;
}
}
};
动态规划,dp[j][i]
用来记录字符串s[j, i]
是否是回文串
class Solution {
public:
bool dp[1000][1000];
int countSubstrings(string s) {
memset(dp, 0, sizeof(dp));
int sum=0;
int l = s.length();
// i为子串末尾,j为字串开头
for(int i=0;i<l;i++){
for(int j=i;j>=0;j--){
if(s[i]==s[j] && (i-j<=2 || dp[j+1][i-1])){
dp[j][i] = true;
sum++;
}
}
}
return sum;
}
};