https://leetcode-cn.com/problems/palindromic-substrings/
方法一:
//dp[i][j]标识i~j序列是否为回文串
//dp[i][j] = dp[i+1][j-1] && s.charAt(i) == s.charAt(j),依赖于dp矩阵中下一行左一列的结果
//因此从下往上,从左往右进行遍历
class Solution {
public int countSubstrings(String s) {
int res = 0, len;
if (s == null || (len = s.length()) < 1) return 0;
boolean[][] dp = new boolean[len][len];
System.out.println(dp[0][0]);
for(int i = len - 1; i >= 0; i--){
for(int j = i; j < len; j++){
if(s.charAt(i) == s.charAt(j)){
if(j - i <= 1){
dp[i][j] = true;
res++;
}else if(dp[i + 1][j - 1]){
res++;
dp[i][j] = true;
}
}
}
}
return res;
}
}
方法二:
//dp耗费的空间比较大
//中心拓展法【双指针法】
class Solution {
int num = 0;
public int countSubstrings(String s) {
for(int i = 0; i < s.length(); i++){//遍历每个点,以当前点或当前点相邻的下一个点向外扩展遍历
count(s,i, i);//奇数个数的回文是以一个点为中心向外扩展
count(s,i, i+1);//偶数的回文是以两个点为中心向外扩展
}
return num;
}
public void count(String s, int i, int j){
while(i >= 0 && j < s.length() && s.charAt(i--) == s.charAt(j++))
num++;
}
}
}