Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
1.暴力解法
排列组合所有可能的字符串
/**
* 回文
* @param {String} s
*
*
*/
var longestPalindrome = function(s) {
var len = s.length;
var tmpStr = '';//子串
var maxStr = '';//最长回文
for(let m = 0 ; m < len ; m ++){
for(let n = m ; n < len ; n ++){
tmpStr = s.substring(m,n + 1);
if(tmpStr === tmpStr.split('').reverse().join('') && maxStr.length < tmpStr.length){
maxStr = tmpStr;
}
}
}
return maxStr;
};
2.中心法
下面这个写法好理解一点
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function (s) {
var maxL = 0;
var maxR = 0;
var maxLen = 0;
var len = s.length;
var left = 0;
var right = 0;
for (let i = 0; i < len; i++) {
left = i;
right = i;
while (s[left] && s[right] && s[left] === s[right]) {
left = left - 1;
right = right + 1;
}
left = left + 1;
right = right - 1;
//奇数
if (right - left + 1 > maxLen) {
maxL = left;
maxR = right;
maxLen = right - left + 1;
}
left = i;
right = i + 1;
while (s[left] && s[right] && s[left] === s[right]) {
left = left - 1;
right = right + 1;
}
left = left + 1;
right = right - 1;
//偶数
if (right - left + 1 > maxLen) {
maxL = left;
maxR = right;
maxLen = right - left + 1;
}
}
return s.substring(maxL,maxR + 1);
};
这个优雅一点
var longestPalindrome = function (s) {
var maxL = 0;
var maxR = 0;
var maxLen = 0;
var len = s.length;
var left = 0;
var right = 0;
for (let i = 0; i < len; i++) {
left = i;
right = i;
var len1 = expand(s,left,right);
var len2 = expand(s,left,right + 1);
var maxOfTwo = Math.max(len1,len2);
if (maxOfTwo > maxLen) {
maxL = left - Math.floor((maxOfTwo - 1)/2);
maxR = left + Math.floor((maxOfTwo)/2);
maxLen = maxR - maxL + 1;
}
}
return s.substr(maxL,maxLen);
};
function expand(s,l,r){
while (s[l] && s[r] && s[l] === s[r]) {
l = l - 1;
r = r + 1;
}
l = l + 1;
r = r - 1;
return r - l + 1;
}
下面这篇讲解的思虑比较清晰,可以参考
算法题解:从字符串中查找最长的回文子串(搜索最佳结果的一般方法)