題目描述
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);