leetcode5. 最长回文子串

48 阅读1分钟

错误示范

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    const N = 1010;
    let st = 0, se = 0;
    let f = new Array(N).fill(0).map(() => new Array(N).fill(0));
    let len = s.length;
    for (let i = 0; i < len; i ++) {
        for (let j = i; j < len; j ++) {
            if (s[i] == s[j]) {
                if (j - i + 1 <= 3) f[i][j] = 1;
                else if (f[i+1][j-1]) f[i][j] = 1;
            }
            if (j - i + 1 > se - st + 1 && f[i][j]) {
                st = i, se = j;
            }
        }
    }
    let res = s.slice(st, se+1);
    return res;
};

枚举i和j时,不能通过常规枚举方法,不然当f[i+1][j-1]满足时,f[i][j]=1错误。应为当我们枚举到当时的i和j时,我们的f[i+1][j-1]并没有被枚举到,也就是f[i+1][j-1]必为0.

后面发现枚举长度也不行

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    const N = 1010;
    let st = 0, se = 0;
    let f = new Array(N).fill(0).map(() => new Array(N).fill(0));
    let len = s.length;
    for (let i = 0; i < len; i ++) f[i][i] = 1;
    for (let l = 2; l <= len; l ++) {
        for (let i = 0; i < len - 2; i ++) {
            j = i + l - 1;
            if (j > len - 1) continue;
            if (s[i] == s[j]) {
                if (l < 3) f[i][j] = 1;
                else if (f[i+1][j-1]) f[i][j] = 1
            }
            if (f[i][j] && l > se - st + 1) {
                se = j, st = i;
            }
        }
    }
    let res = s.slice(st, se+1);
    return res;
};

原来是必须要从后往前枚举,应为我的的f[i+1][j-1]是在f[i][j]后面的,所以从后往前枚举就能够先遍历f[i+1][j-1]。

正确代码


/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    const N = 1010;
    let st = 0, se = 0;
    let f = new Array(N).fill(0).map(() => new Array(N).fill(0));
    let len = s.length;
    for (let i = 0; i < len; i ++) f[i][i] = 1;
    for (let l = 2; l <= len; l ++) {
        for (let i = len - 2; i >= 0; i --) {
            j = i + l - 1;
            if (j > len - 1) continue;
            if (s[i] == s[j]) {
                if (l < 3) f[i][j] = 1;
                else if (f[i+1][j-1]) f[i][j] = 1
            }
            if (f[i][j] && l > se - st + 1) {
                se = j, st = i;
            }
        }
    }
    let res = s.slice(st, se+1);
    return res;
};