[LeetCode]Longest Palindromic Substring

解題思路:
遍歷string,從每一個char往兩邊搜索(index:left,right),記錄最大回文的 left 和 length

有一點優化的地方,就是如果連續幾個字符相同,那麼right直接指向最右邊那個字符。
如果操作的優點是,不用區分 aba 和 abba 中的b帶來的操作


// C++實現:
class Solution {
public:
    string longestPalindrome(string s) {
        if (s.length() < 2) return s;

        int maxLeft = -1;
        int maxLen = 0;
        for (int start = 0; start < s.length(); ){
            int left = start;
            int right = start;
            while(right < s.length()-1 && s[right+1] == s[right]){
                right ++;
            }

            start = right + 1;

            while(left > 0 && right < s.length()-1 && s[right + 1] == s[left - 1]){
                right ++;
                left --;
            }

            if (maxLen < right - left + 1){
                maxLeft = left;
                maxLen = right - left + 1;
            }
        }
        return s.substr(maxLeft, maxLen);
    }
};

// Java 實現:
public class Solution {
    public String longestPalindrome(String s) {
        if ( s.length() < 2) return s;
        char[] sc = s.toCharArray();

        int maxLeft = -1;
        int maxLen = 0;
        for (int start = 0; start < sc.length; ){
            int left = start;
            int right = start;
            while((right < sc.length-1) && (sc[right+1] == sc[right] )){
                right ++;
            }
            start = right + 1;

            while((right < sc.length-1 )&&( left > 0) && (sc[right+1] == sc[left-1])){
                right ++;
                left --;
            }

            if (maxLen < (right-left + 1)){
                maxLeft = left;
                maxLen = right-left + 1;
            }
        }
        return s.substring(maxLeft, maxLeft + maxLen);
    }
}

// Java 實現另一種辦法
// 基於 迴文的 中心可能是中間一個,也可能是中間一對
public class Solution {
    public String longestPalindrome(String s) {
        int start = 0;
        int end = 0;

        for (int i = 0; i < s.length(); ++i ){
            int len1 = palindromeLength(s, i, i);
            int len2 = palindromeLength(s, i, i+1);
            int len = Math.max(len1, len2);

            if ( len > end-start+1){
                start = i - len/2 + ((len%2 == 0)? 1 : 0);
                end = i + len/2;
            }
        }

        return s.substring(start, end+1);
    }

    private int palindromeLength(String s, int start, int end){
        int L = start;
        int R = end;
        while(L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)){
            L --;
            R ++;
        }
        return R - L -1;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章