#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) 还有一种思路从中间开始向两边延伸 可能更快一点

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容