题目描述
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
(给一个字符串s,找到字符串s中的最常回文字符串,可以假设s最常为1000个字符)
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
题目分析
有另一个题目是“判断字符串s是否是回文字符串”,可以将该字符串和它的反序字符串比较是否相等来确定。
这个题目可以在它的基础上,可以遍历该字符串中所有的子字符串,判断它和它的反序是否相等,找出最长的即可,这是一种时间复杂度比较高的方法。
程序示例
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
if (s.length<=1 || s===s.split('').reverse().join('')){
return s
}
var res = ""
var len = s.length
var s_rev = s.split('').reverse().join('')
for (var i=0;i<len;i++){
for (var j=i+1;j<len;j++){
var tmp = s.substring(i,j+1)
if (tmp == s_rev.substring(len-j-1, len-i)){
res = tmp.length>res.length? tmp:res
}
}
}
return res || s[0]
};
其他解法
在LeetCode上面看到的另外一种时间复杂度更小一些的方法:
简单点说就是以每一个字符为中心(此情况为假设回文串是奇数个字符)或者以空位为中心(假设回文串是偶数个字符),不断向两边查询,判断两边对应的字符是否相同,直到不相同为止。
这里用来分辨奇数或者偶数的巧妙的方法是:for循环i增加的step设为0.5,每次left=Math.ceil(i-1),right=Math.floor(i+1).
程序如下(直接复制的,侵删):
var a = s.split(''),left, right,
size = a.length,
max = Number.MIN_VALUE,
start = 0;
for(var i = 0; i < size; i = i + 0.5){
left = Math.ceil(i - 1);
right = Math.floor(i + 1);
while(left >=0 && right < size) {
if (a[left] === a[right]){
left--;
right++;
} else { break;}
}
if (right - left - 1 > max){
max = right - left - 1;
start = left + 1;
}
}
return s.slice(start, start + max);