LeetCode 5.最長迴文子串

Wament發表於2019-04-14

最長迴文子串

暴力破解法
選出所有子字串可能的開始和結束位置,並檢驗它是不是迴文,時間複雜度為O(n^3),空間複雜度為O(1)

var longestPalindrome = function (s) {
    var len = s.length;
    if(len == 0){
        return "";
    }
    let result = s[0];//1個字元也是迴文子串
    for(let i=0; i<len; i++){
        for(let j=i+1; j<len; j++){
            let str = s.slice(i, j);
            let restr = str.split('').reverse().join('');
            if(str == restr){
                result = str.length > result.length? str: result;
            }
        }
    }
    return result;
};
複製程式碼

LeetCode 5.最長迴文子串
動態規劃

LeetCode 5.最長迴文子串

var longestPalindrome = function (s) {
    let len = s.length;
    let result;
    let dp = Array(len).fill(0).map(x=>Array(len).fill(0));
    let i,j,L;
    if(len<=1){
        return s;
    }
    //只有一個字串的時候是迴文
    for(i=0; i<len; i++){
        dp[i][i] = 1;
        result = s[i];
    }
    for(L = 2; L<=len; L++){
        //L為當前所判斷的字串的長度,i是第一個字元的index,j是最後一個字元的index
        for(i = 0; i<=len-L; i++){
            //L = j - i + 1
            j = L + i - 1;
            //如果當前判斷字串符長度為2
            if(L == 2 && s[i] == s[j]){
                dp[i][j] = 1;
                result = s.slice(i,i+L);
            }
            //當前判斷的字元長度不為2
            //s[i] == s[j]判斷第一個字串和第二個字串是否相同
            //dp[i+1][j-1] == 1判斷相關子串是否迴文
            //當前字串長度為L,則需要判斷字串長度為L-2,首字元index為i+1,尾字元index為j-1的子串是否為迴文
            else if(s[i] == s[j] && dp[i+1][j-1] == 1){
                dp[i][j] = 1;
                result = s.slice(i,i+L);
            }
        }
    }
    return result;
}
複製程式碼

LeetCode 5.最長迴文子串
emm不知道什麼演算法
大概的想法就是先把字串變成長度為奇數,在字元間加上#,然後以每一個字元為中心,向左右擴散判斷是否是迴文子串

var longestPalindrome = function (s) {
    var i = 0, pre, next;
        if (s.length < 2) {
            return s;
        }
        s = s.split('').join('#');
        var len = s.length;
        var result = s[len - 1];
        while (i < len) {
            for (pre = i - 1, next = i + 1; s[pre] == s[next] && s[pre] && s[next]; pre-- , next++) {
                if (next - pre + 1 > result.length) {
                    result = s.slice(pre, next + 1);
                }else if(next - pre + 1 == result.length && s[i] == '#'){
                    result = s.slice(pre, next + 1);
                }
            }
            i++;
        }
    return result.split('#').join('');
};
複製程式碼

馬拉車
這個一直不能理解- -智商堪憂,附上鍊接給各位看官吧⬇

參考連結:blog.csdn.net/qq_31126175…

相關文章