题目
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
输入: “abc”
输出: 3
解释: 三个回文子串: “a”, “b”, “c”.
输入: “aaa”
输出: 6
说明: 6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”.
思路
用数组dp【i】【j】表示是否为回文子串。
首先,单个元素是回文。长度小于3且边界相等的是回文。
其次,当边界相等,长度大于3的时候,判断通过:dp[i][j] = (s[i] == s[j]) and dp[i + 1][j - 1]。因为dp[i + 1][j - 1]是判断过的,再加上边界相等。就可以进行判断。
代码
public int countSubstrings(String s) {
char []ch = s.toCharArray();
int len= s.length();
boolean [][]dp = new boolean[len][len];
int res=0;
//单个元素
for(int i = 0;i<len;i++){
dp[i][i]=true;
res++;
}
//从i到j
for(int j = 0;j<len;j++){
for(int i = 0;i<j;i++){
//边界
if(i==j){
continue;
}
if(ch[i]!=ch[j]){
dp[i][j]=false;
}
else{
//边界相等,长度小于3,一定是回文
if(j-i<3){
dp[i][j]=true;
}
else{
dp[i][j] = dp[i+1][j-1];
}
}
if(dp[i][j]){
res++;
}
}
}
return res;
}