p92 最长回文子串(leetcode 5)

一:解题思路

方法一:Time:O(n^2),Space:O(1)

方法二:Time:O(n^2),Space:O(1)

相同的Java程序改到C++却不能运行有点奇怪!还是把程序贴上。原因可能之后会想出来!

二:完整代码示例 (C++版和Java版)

C++:

方法一:

class Solution {
public:
    string longestPalindrome(string s) {
        if (s == "" || s.length() == 0) return s;
        int n = s.length();
        int start = 0;
        int maxLen = 0;
        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] && (j - i + 1 > maxLen))
                {
                    start = i;
                    maxLen = j - i + 1;
                }
            }
        }

        return s.substr(start,maxLen);
    }
};

 

 

方法二:

class Solution {
private:
    int expand(string s, int left, int right)
    {
        while (left >= 0 && right < s.length() && s[left] == s[right])
        {
            left--;
            right++;
        }
        return right - left - 1;
    }
public:
    string longestPalindrome(string s)
    {
        if (s.length() == 0) return "";
        int maxLen = 0;
        int start = 0;
        for (int i = 0; i < s.length(); i++)
        {
            int len1 = expand(s, i, i);
            int len2 = expand(s, i, i + 1);
            int len = max(len1, len2);
            if (len > maxLen)
            {
                start = i - (len - 1) / 2;
                maxLen = len;
            }
        }

        return s.substr(start, start + maxLen);
    }
};

方法一Java:

class Solution {
        public String longestPalindrome(String s)
        {
               if(s==null || s.length()==0) return "";
               int n=s.length();
               int start=0;
               int maxLen=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] && j-i+1>maxLen)
                       {
                           start=i;
                           maxLen=j-i+1;
                       }
                   }
               }

               return s.substring(start,start+maxLen);
        }
    }

方法二Java:

class Solution {
        private int expand(String s,int left,int right)
        {
            while (left>=0 && right<s.length() && s.charAt(left)==s.charAt(right))
            {
                left--;
                right++;
            }
            return right-left-1;
        }

        public String longestPalindrome(String s)
        {
               if(s==null || s.length()==0) return "";
               int maxLen=0;
               int start=0;
               for(int i=0;i<s.length();i++)
               {
                   int len1=expand(s,i,i);
                   int len2=expand(s,i,i+1);
                   int len=Math.max(len1,len2);
                   if(len>maxLen)
                   {
                       start=i-(len-1)/2;
                       maxLen=len;
                   }
               }

               return s.substring(start,start+maxLen);
        }
    }

 

posted @ 2020-04-06 15:21  repinkply  阅读(168)  评论(0)    收藏  举报