错误示范
/**
* @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;
};