#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) 還有一種思路從中間開始向兩邊延伸 可能更快一點

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容