程序应该没有问题,提交不能AC,主要的原因是超时。最好的时候,达到85个案例,还有几个案例未能测试。本地测试未通过案例,均可以。可能是我使用对象而非数组来作为动态规划的容器,导致开销过大。目前结合前面用Javascript刷LeetCode发现,在 javascript 中,乘除操作比较耗时,for循环能少则少。后面还会注意不同操作的耗时、性能情况。
先给出最化结构的版本,很短:
var longestPalindrome = function(s) {
var p = {0:{}};
var result = [0,0];
for(var i = 0; i<s.length; i++){
p[i] == undefined? p[i] = {}:p[i+1] ={};
p[i][i] = p[i+1][i] = true;
}
for(var i = 1; i<s.length; i++){
for(var j = 0; j < s.length - i; j++){
p[j][j+i] = p[j+1][j+i-1] && (s[j] == s[j+i]);
if( p[j][j+i] && i > result[0]){result[0] = i,result[1] = j;}
}
}
return s.substr(result[1],result[0]+1);
};
中间版本:
var longestPalindrome = function(s) {
var p = {0:{}};
var result = [0,0,0]
// 初始化
for(var i = 0; i<s.length; i++){
p[i] == undefined? p[i] = {}:p[i+1] ={};
// console.log(p[i],p[i+1])
p[i][i] = true;
p[i+1][i] = true;// 这一步很关键,只是用于初始化
}
for(var i = 1; i<s.length; i++){
for(var j = 0; j < s.length - i; j++){
p[j][j+i] = p[j+1][j+i-1] && (s[j] == s[j+i]);
// console.log(j,j+i,p[j+1][j+i-1],s[j] == s[j+i])
}
}
for(var i in p){
for(var j in p[i]){
if(p[i][j]){
j-i > result[0]?(result[0] = j-i,result[1] = i,result[2] = j):(null);
}
// console.log(i,j,p[i][j])
}
}
// console.log(result);
return s.substr(result[1],result[0]+1);
};
// 优化版本
var longestPalindrome = function(s) {
var p = {0:{}};
var result = [0,0];
// 初始化
for(var i = 0; i<s.length; i++){
p[i] == undefined? p[i] = {}:p[i+1] ={};
// console.log(p[i],p[i+1])
p[i][i] = true;
p[i+1][i] = true;// 这一步很关键,只是用于初始化
}
for(var i = 1; i<s.length; i++){
for(var j = 0; j < s.length - i; j++){
p[j][j+i] = p[j+1][j+i-1] && (s[j] == s[j+i]);
p[j][j+i] && i > result[0]?(result[0] = i,result[1] = j):(null);
}
}
return s.substr(result[1],result[0]+1);
};