LeetCode.5 最长回文子串(longest-palindromic-substring)(JS)

一、问题

最长回文子串:

给定一个字符串 s,找到 s 中最长的回文子串。你能够假定 s 的最大长度为 1000。

示例 1:

输入: “babad”
输出: “bab”
注重: “aba” 也是一个有用答案。

示例 2:

输入: “cbbd”
输出: “bb”

二、我的答案

  1. 思绪

    1.排除法,最优解法一定不是暴力遍历
    2.紧接着想到第三题中运用的两个指针同步遍历一个字符串的要领,尝试了一下,发明跟暴力遍历没有区分
    3.再看几遍题,要找的是回文字符串,回文字符串的特性在于双方字符都雷同,也就是说须要找的是双方字符都雷同中心点(注重是中心点而不是中心字符,由于题干中例1的中心点是a,然则例2的中心点是bb)

  2. 代码

    v1.0(过于貌寝,可跳过直接看申明和v2.0)

       /**
        * @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函数举行拓展
    

           经由过程,下一步要做的就是优化成能看懂的版本

           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
};
    原文作者:cvSoldier
    原文地址: https://segmentfault.com/a/1190000018783854
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞