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

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