2.若回文串长度为偶数,则要使s[i-1-j, ... , i-1, i, ..., i+j]为回文串(即i-1,i两个基准) 同时还要保证下标不越界.
class Solution {
public:
int countSubstrings(string s) {
int count = 0; //计数
int n = s.size();
for (int i = 0; i < n; i++) { //遍历整个串一次
for (int j = 0; i-j >= 0 && i+j < n && s[i-j] == s[i+j]; j++) //检查回文长度奇数情况
count++;
for (int j = 0; i-1-j >= 0 && i+j < n && s[i-1-j] == s[i+j]; j++) //检查偶数情况
count++;
}
return count;
}
};
解法二:dp
参照5.最长回文子串
构建dp矩阵,然后遍历dp统计True的数量即可。
class Solution:
def countSubstrings(self, s: str) -> int:
n = len(s)
dp = [[0 for i in range(n)] for i in range(n)] #二维数组创建
for i in range(n-1, -1, -1):
for j in range(i, n):
dp[i][j] = (s[i] == s[j] and (j - i < 3 or dp[i+1][j-1]))
res = 0
for i in range(n):
res += dp[i].count(True)
return res