字符串长度 n
i 表示子串最后一个一个字符索引
j 表示子串第一个字符索引
int dp[n][n]
注: 01 == 1表示s[0] ==s[1], 01 == 0 表示s[0] != s[1]?
loop 1: i = 0 j<=i 11(表示同一个字符)那么一定是回文子串
loop 2:i = 1; ? ?01,11 (i-j<2)
loop 3:i = 2;
02,11(由loop 2已经检测过) ,所以如果 s[0] == s[2] && dp[1][1] == 1,02是回文子串?
12 ,s[1] == s[2] && i-j<2 是回文子串,否则不是
22 ,一定是会问子串
loop 依次类推,检测字符串中的全部的回文子串。
class Solution {
public:
int countSubstrings(string s) {
int n = s.size();
if(n == 0) return 0;
if(n == 1) return 1;
int dp[n][n] = {0};
int res = 0;
for(int i = 0;i<n;i++){
for(int j = 0;j<=i;j++){
dp[j][i] = (s[j] == s[i])&&((i-j<2) || dp[j+1][i-1]);
if(dp[j][i]) res++;
}
}
return res;
}
};