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;
        }
    }

 

posted @ 2020-04-05 17:11  repinkply  阅读(206)  评论(0)    收藏  举报