Given a string, your task is to count how many palindromic substrings in this string.java
The substrings with different start indexes or end indexes are counted as different substrings even they consist of same characters.this
Example 1:code
Input: "abc" Output: 3 Explanation: Three palindromic strings: "a", "b", "c".
Example 2:递归
Input: "aaa" Output: 6 Explanation: Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa".
Note:leetcode
题目地址字符串
题目的意思是:找出字符串中全部回文串,不一样位置的回文串不算同一个。这道题我只能想到从左到右按照从1到s.length的长度依次扫N遍。并且这还不包括判断是不是回文串这一步所用的时间。而判断回文串显然是能够有重复计算的子问题的,因此要用到动态规划。get
依旧是用规模从大到小的备忘录递归解法。这道题作下来仍是挺轻松的,我发现我愈来愈喜欢用递归了,对递归的掌控力也变强了。input
class Solution { private boolean[][] dp; public int countSubstrings(String s) { int result=0; dp = new boolean[s.length()][s.length()]; for(int i=0;i<s.length();i++){ for(int j=0;j+i<s.length();j++){ dynamicProgramming(s, j, j+i); } } for(int i=0;i<dp.length;i++){ for(int j=0;j<dp[i].length;j++){ // System.out.println(i+","+j+"="+dp[i][j]); if(dp[i][j]){ result++; } } } return result; } private boolean dynamicProgramming(String s, int left, int right){ if(left==right){ dp[left][right] = true; return dp[left][right]; } if(dp[left][right]){ return dp[left][right]; } if(s.charAt(left)!=s.charAt(right)){ dp[left][right] = false; return dp[left][right]; }else{ if(right-left>1){ dp[left][right] = dynamicProgramming(s, left+1, right-1); return dp[left][right]; }else{ dp[left][right] = true; return dp[left][right]; } } } }