思路
1.定义dp数组
dp[i][j]表示从下标i开始j结束的字符串如果是回文串的话,dp[i][j] = true;反之为false。
2.定义递推公式
如果s.charAt(i) != s.charAt(j);那么必定不是回文串,所以dp[i][j] = false.
如果相等则判断i和j的位置,如果距离小于等于2。则一定是回文串;如果距离大于2则需要判断dp[i+1][j-1]是否为回文串了。
3.初始化dp数组
根据定义dp数组的每个元素都为false。
4.遍历dp数组
根据递推公式,dp[i][j]和dp[i+1][j-1]有关,所以需要自左到右,自下向上遍历。所以先遍历j在遍历i
5.打印dp数组
最后的结果用result存储了。输出result即可。或者遍历dp数组,统计值为true的个数。
代码
class Solution {
public int countSubstrings(String s) {
int l = s.length();
int result = 0;
boolean dp[][] = new boolean[l][l];
for(int j = 0;j<l;j++){
for(int i = 0;i<=j;i++){
if(s.charAt(i) != s.charAt(j)){
dp[i][j] = false;
}else{
if(j-i<=2 && j-i>=0){
dp[i][j] = true;
result++;
}else{
if( i+1<=j-1 && dp[i+1][j-1]){
dp[i][j] = true;
result++;
}
}
}
}
}
return result;
}
}