Leetcode前端必会系列:最长回文子串

52 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

引言

算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。

题目描述

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入: s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。

示例 2:

输入: s = "cbbd"
输出: "bb"

 

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

 

分析

根据题目的分析,我们如何选择最长回文子串?通过动态规划可以轻松的完成题目的解决,我们需要按照回文的规则一步步推导

  1. 选择回文子串的规则推导
  2. 初始化dp方程组,初始每单个字符是1
  3. 开始遍历,两层循环,按照dp方程组规则动态规划
  4. 返回最大的字符串

解答

   var longestPalindrome = function(s) {

      let len = s.length

      let dp = Array.from(new Array(len),item=>new Array(len).fill(false))

      for(let i=0;i<len;i++) dp[i][i] = true
      //dp[i][j] = dp[i+1][j-1]+1

      for(let i=len-1;i>=0;i--) {

        for(let j=i+1;j<len;j++) {

          if(s[i]===s[j]) {

            if(j-i<=1) dp[i][j] = true

            else dp[i][j] = dp[i+1][j-1]

          }

        }

      }

      //找最大的

      let max = 1

      let begin = 0

      for(let i=0;i<len;i++) {

        for(let j=i+1;j<len;j++) {

          if(dp[i][j] && j-i+1>max) {

            max = j-i+1

            begin = i

          }

        }

      }

      return s.slice(begin,begin+max)

    };

通过题目的分析,我们需要根据动态规划的设计规则完成设计,整体的设计是基于回文的规则完成的。

总结

通过对最长回文子串题目的讲解,大家学到了进行问题的解决。通过动态规划可以优雅的在低时间和空间复杂度下完成任务。