[LeetCode] Longest Palindromic Substring

Longest Palindromic Substring

Given a string  S , find the longest palindromic substring in  S . You may assume that the maximum length of  S  is 1000, and there exists one unique longest palindromic substring.

解题思路:

1、动态规划,找回文。用二维数组记录j到i是否为回文,若isPalin[j+1][i-1]为回文,且s[j]==s[i],则isPalin[j][i]为回文。

class Solution {
public:
    string longestPalindrome(string s) {
        string result="";
        int len=s.length();
        if(len==0){
            return result;
        }
        int start=0, end=0;
        bool isPalin[len][len];       //i到j是否为回文
        for(int i=0; i<len; i++){
            isPalin[i][i]=true;
        }
        
        for(int i=1; i<len; i++){
            for(int j=i-1; j>=0; j--){        //计算j到i是否为回文
                if( (j==i-1&&s[j]==s[i]) || (isPalin[j+1][i-1]&&s[j]==s[i])){
                    isPalin[j][i]=true;
                    if(i-j>end-start){
                        start=j;
                        end=i;
                    }
                }else{
                    isPalin[j][i]=false;
                }
            }
        }
        
        
        result = s.substr(start, end-start+1);
        
        return result;
    }
};
此前用某个编译器不支持int array[变量],因此每次都用new,却会报内存溢出的错误。leetcode的编译器支持int array[变量],可以通过。

2、上述方法空间复杂度为O(n^2),时间复杂度为O(n^2)。若以某个字符(或字符的空隙)向两边扩展统计,可以将空间复杂度降为O(1),下面是誊抄其他人的Java代码:

public String longestPalindrome(String s) {
    if(s == null || s.length()==0)
        return "";
    int maxLen = 0;
    String res = "";
    for(int i=0;i<2*s.length()-1;i++)
    {
        int left = i/2;
        int right = i/2;
        if(i%2==1)
            right++;
        String str = lengthOfPalindrome(s,left,right);
        if(maxLen<str.length())
        {
            maxLen = str.length();
            res = str;
        }
    }
    return res;
}
private String lengthOfPalindrome(String s, int left, int right)
{
    
    while(left>=0 && right<s.length() && s.charAt(left)==s.charAt(right))
    {
        left--;
        right++;
    }
    return s.substring(left+1,right);
}


你可能感兴趣的:(LeetCode,C++)