p89 回文子串个数(leetcode 647)
一:解题思路
方法一:判断S(i,j)是否回文。1.当i==j的时候,只有一个字符,肯定是回文。2.当i+1==j的时候,只需要判断S(i)==S(j),就可以知道S(i,j)是否回文。3.i+1!=j的时候,需要判断 S(i)==S(j) && S(i+1,j-1)。因此不仅需要判断S(i)==S(j),还需要判断S(i+1,j-1)这个子串是否回文。因此用一个二维数组来保存是否回文的信息即可。因为首先要知道子串是否回文,因此 i:n-1->0 ,j:i->n-1(i从大到小进行遍历,j从小到大进行遍历)。这种方法的本质是动态规划,通过保存小问题的解,来求解大问题的解。Time:O(n^2),Space:O(n^2)
方法二:以每个字符串中的字符为中分别向两边进行扩展,然后对比是否相等。比如:aba 有4个回文字符串。abba有6个回文字符串。Time:O(n^2),Space:O(1)
二:完整代码示例 (C++版和Java版)
方法一C++:
class Solution { public: int countSubstrings(string s) { if (s.size() == 0) return 0; int count = 0; int n = s.size(); vector<vector<bool>> d(n,vector<bool>(n,false)); for (int i = n - 1; i >= 0; i--) { for (int j = i; j < n; j++) { if (i == j) d[i][j] = true; else if (i+1 == j) d[i][j] = (s[i]==s[j]); else d[i][j] = (s[i]==s[j] && d[i+1][j-1]); if (d[i][j]) count++; } } return count; } };
方法二C++:
class Solution { public: int expand(string s, int left, int right) { int count = 0; while (left >= 0 && right < s.size() && s[left] == s[right]) { count++; left--; right++; } return count; } int countSubstrings(string s) {
if(s.size()==0) return 0; int count = 0; for (int i = 0; i < s.size(); i++) { count += expand(s,i,i); count += expand(s,i,i+1); } return count; } };
方法一Java:
class Solution { public int countSubstrings(String s) { if(s==null || s.length()==0) return 0; int n=s.length(); int count=0; boolean[][] d=new boolean[n][n]; for(int i=n-1;i>=0;i--) { for(int j=i;j<n;j++) { if(i==j) d[i][j]=true; else if(i+1==j) d[i][j]=(s.charAt(i)==s.charAt(j)); else d[i][j]=(s.charAt(i)==s.charAt(j) && d[i+1][j-1]); if(d[i][j]) count++; } } return count; } }
方法二Java:
class Solution { private int expand(String s,int left,int right) { int count=0; while(left>=0 && right<s.length() && s.charAt(left)==s.charAt(right)) { count++; right++; left--; } return count; } public int countSubstrings(String s) { if(s==null || s.length()==0) return 0; int count=0; for(int i=0;i<s.length();i++) { count+=expand(s,i,i); count+=expand(s,i,i+1); } return count; } }
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号