https://leetcode-cn.com/problems/palindromic-substrings/
-
暴力
class Solution { public int countSubstrings(String s) { int count=0; for(int i=0;i<s.length();i++){ for(int j=i;j<s.length();j++){ if(isHuiWen(s,i,j)==true){ count++; } } } return count; } public Boolean isHuiWen(String s,int l,int r){ int left = l,right=r; while (left<=right){ if(s.charAt(left)!=s.charAt(right)){ return false; } left++; right--; } return true; } }
- 动态规划
/*
状态:dp[i][j] 表示字符串s在[i,j]区间的子串是否是一个回文串。
状态转移方程:当 s[i] == s[j] && (j - i < 2 || dp[i + 1][j - 1]) 时,dp[i][j]=true,否则为false
解释:
当只有一个字符时,比如 a 自然是一个回文串。
当有两个字符时,如果是相等的,比如 aa,也是一个回文串。
当有三个及以上字符时,比如 ababa 这个字符记作串 1,把两边的 a 去掉,也就是 bab 记作串 2,可以看出只要串2是一个回文串,那么左右各多了一个 a 的串 1 必定也是回文串。所以当 s[i]==s[j] 时,自然要看 dp[i+1][j-1] 是不是一个回文串
*/
public static int countSubstrings(String s) {
boolean[][] dp = new boolean[s.length()][s.length()];
int ans = 0;
for(int i=0;i<s.length();i++){
for(int j=0;j<=i;j++){
if((s.charAt(i)==s.charAt(j))&&(i-j<2||dp[j+1][i-1])){
dp[j][i]=true;
ans++;
}
}
}
return ans;
}