LeetCode.5 最長迴文子串(longest-palindromic-substring)(JS)

1、題目

最長迴文子串:數組

給定一個字符串 s,找到 s 中最長的迴文子串。你能夠假設 s 的最大長度爲 1000。函數

示例 1:

輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。優化

示例 2:

輸入: "cbbd"
輸出: "bb"指針

2、個人答案

  1. 思路

    1.排除法,最優解法確定不是暴力遍歷
    2.緊接着想到第三題中使用的兩個指針同步遍歷一個字符串的方法,嘗試了一下,發現跟暴力遍歷沒有區別
    3.再看幾遍題,要找的是迴文字符串,迴文字符串的特色在於兩邊字符都相同,也就是說須要找的是兩邊字符都相同中間點(注意是中間點而不是中間字符,由於題幹中例1的中間點是a,可是例2的中間點是bb)code

  2. 代碼

    v1.0(過於醜陋,可跳過直接看說明和v2.0)leetcode

    /**
        * @param {string} s
        * @return {string}
        */
        var longestPalindrome = function(s) {
         function expendString(index1, index2) {
           if(index1 > 0 && index2 + 1 < s.length &&s[index1 -1] === s[index2 + 1]){
             return expendString(index1 -1, index2 + 1)
           } else {
             return [index1, index2, index2 - index1]
           }
         }
         let longestArr = [0, 0, 0]
         let tempArr
         for(let i = 1; i< s.length; i++) {
           if(i + 1 < s.length&&s[i-1] === s[i+1]) {
             tempArr = expendString(i-1, i+1)
             tempArr[2] > longestArr[2] ? longestArr = tempArr : null
           }
           if(s[i -1] === s[i]) {
             tempArr = expendString(i - 1, i)
             tempArr[2] > longestArr[2] ? longestArr = tempArr : null
           }
         }
         return s.slice(longestArr[0], longestArr[1] + 1)
       };

    講解字符串

    1. 函數expendString做用爲以兩個傳參拓展字符串,判斷是否依然是迴文字符串
    
    2. 數組longestArr做用爲防止當前最長字串的兩個下標和長度(我也不知道當時本身爲何還要費勁寫個數組)
    
    3. for循環中判斷迴文串的中點是一個('aba')仍是兩個('abba'),而後分別調用上文定義的expendString函數進行拓展

           經過,下一步要作的就是優化成能看懂的版本get


           v2.0同步

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s){
  function expendString(index1, index2) {
    if (index1 >= 0 && index2 < s.length && s[index1] === s[index2]) {
      expendString(index1 - 1, index2 + 1)
    } else {
      index2 - index1 > longestString.length ?
        longestString = s.slice(index1 + 1, index2) :
        null
    }
  }
  let longestString = s[0] || ''
  for (let i = 1; i < s.length; i++) {
    if (i + 1 < s.length) {
      expendString(i - 1, i + 1)
    }
    if (s[i - 1] === s[i]) {
      expendString(i - 1, i)
    }
  }
  return longestString
};
相關文章
相關標籤/搜索