#5 Longest Palindromic Substring

寻找字符串中最大的回文序列 思想是一个回文字符串的字串也必然是回文序列 于是从左边开始以每一个字母当作回文序列的中心字母(注意a aa aaa aaaa)有可能是一个字母为中心 也有可能以两个字母为中心。

/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
  var length = s.length,i = 0,start = 0,end = s.length - 1,result = {length: 0, str: ''},temp;
  function checkpalindrom(left,right) {
    var long = 0;
    while(left >= start && right <= end)
    {
      if(s[left] !== s[right]) {
        break;
      }
      left--;
      right++;
    }
    // 转换为截取位置状态
    left++;
    right--;
    long = right - left + 1;
    if(long > result.length) {
      result.length = long;
      result.str = s.slice(left, right + 1);
    }
  }

  for(;i < length;i++) {
    // 优化 当有很大的值的时候停止查询
    temp = i - start > end - i ? end - i : i - start;
    if(result.length > temp * 2 + 1)
      break;
    // 3个相同字母相连以及以上
    if(s[i] === s[i+1] && s[i] === s[i-1] && i < end)
    {
      if(s[i + 1] === s[i + 2]) {
        checkpalindrom(i,i+1);
      }
      checkpalindrom(i,i);
    }
    // 两个字母为中心
    else if(s[i] === s[i+1])
      checkpalindrom(i,i+1)
    // 不相连单字母为中心
    else
      checkpalindrom(i,i);
  }
  return result.str;
};

复杂度为O(n2) 还有一种思路从中间开始向两边延伸 可能更快一点

你可能感兴趣的:(#5 Longest Palindromic Substring)