问题:this
Given a string, your task is to count how many palindromic substrings in this string.spa
The substrings with different start indexes or end indexes are counted as different substrings even they consist of same characters.递归
Example 1:字符串
Input: "abc" Output: 3 Explanation: Three palindromic strings: "a", "b", "c".
Example 2:input
Input: "aaa" Output: 6 Explanation: Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa".
Note:string
解决:it
① 计算字符串中回文子串的个数,使用动态规划解决:io
d[i][j]表示从i到j的字符串为是否回文,真则为(1),不然为假(0),class
那么d[i][j]为真的前提是:头尾两个字符串相同而且去掉头尾之后的字串也是回文(即d[i+1][j-1]为真),这里面要注意特殊状况,即:去掉头尾之后为空串,因此若是j-i<3,而且头尾相等,也是回文的。di
class Solution { //22ms
public int countSubstrings(String s) {
int len = s.length();
int res = 0;
boolean[][] dp = new boolean[len][len];
for (int i = len - 1;i >= 0;i --){
for (int j = i;j < len;j ++){
dp[i][j] = ((s.charAt(i) == s.charAt(j) && ((j - i < 3) || dp[i + 1][j - 1])));
if (dp[i][j]){
res ++;
}
}
}
return res;
}
}
② 从中间向两边递归判断回文字符串。
class Solution { //12ms public int countSubstrings(String s) { if (s == null || s.length() == 0) return 0; int len = s.length(); int res = 0; for (int i = 0;i < len;i ++){ res += dfs(s,i,i); res += dfs(s,i,i + 1); } return res; } public int dfs(String s,int left,int right){ int res = 0; while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)){ left --; right ++; res ++; } return res; } }