给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
示例 1:
输入: "abc" 输出: 3 解释: 三个回文子串: "a", "b", "c".
示例 2:
输入: "aaa" 输出: 6 说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".
注意:
- 输入的字符串长度不会超过1000。
思路:动态规划,维护一个二维数组dp,其中dp[j][i]表示s[j]~s[i]是否是回文序列,如果是dp[j][i]=true,否则dp[j][i]等于false。最后统计dp中所有为true的总数即可。递推公式为:
dp[j][i]=true if j==i || (s[j]==s[i] && j==(i-1))
=dp[j+1][i-1] if s[j]==s[i] && j!=(i-1)
=false other situation
参考代码:
class Solution {
public:
int countSubstrings(string s) {
vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));
int n = s.size();
int res = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
if (j == i) {
dp[j][i] = true;
}
else if (s[j] == s[i]) {
if (j != (i - 1)) {
dp[j][i] = dp[j][i] || dp[j + 1][i - 1];
}
else {
dp[j][i] = true;
}
}
if (dp[j][i]) {
res++;
}
}
}
return res;
}
};