寻找字符串中最大的回文序列 思想是一个回文字符串的字串也必然是回文序列 于是从左边开始以每一个字母当作回文序列的中心字母(注意a aa aaa aaaa)有可能是一个字母为中心 也有可能以两个字母为中心。
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
var length = s.length,i = 0,start = 0,end = s.length - 1,result = {length: 0, str: ''},temp;
function checkpalindrom(left,right) {
var long = 0;
while(left >= start && right <= end)
{
if(s[left] !== s[right]) {
break;
}
left--;
right++;
}
// 转换为截取位置状态
left++;
right--;
long = right - left + 1;
if(long > result.length) {
result.length = long;
result.str = s.slice(left, right + 1);
}
}
for(;i < length;i++) {
// 优化 当有很大的值的时候停止查询
temp = i - start > end - i ? end - i : i - start;
if(result.length > temp * 2 + 1)
break;
// 3个相同字母相连以及以上
if(s[i] === s[i+1] && s[i] === s[i-1] && i < end)
{
if(s[i + 1] === s[i + 2]) {
checkpalindrom(i,i+1);
}
checkpalindrom(i,i);
}
// 两个字母为中心
else if(s[i] === s[i+1])
checkpalindrom(i,i+1)
// 不相连单字母为中心
else
checkpalindrom(i,i);
}
return result.str;
};
复杂度为O(n2) 还有一种思路从中间开始向两边延伸 可能更快一点