Longest Palindromic Substring

題目描述

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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章