美文网首页
求字符串的最长回文子串(动态规划)

求字符串的最长回文子串(动态规划)

作者: 任无名F | 来源:发表于2019-03-07 21:47 被阅读0次

问题

给定一个字符串 S,找出其最长的回文子字符串。S 的最大长度为1000。

举例

输入:"babad"

输出:"bab"
(注:"aba" 也是一个正确的结果)

思路

若长度为 L 的字符串为回文,则去掉首尾的字符,长度为 L-2 的字符串也为回文。
即全局最优解包含局部最优解。

最小子问题

  1. 单个字符独立成为一个回文字符串
  2. 相邻的两个相同字符,是一个回文字符串

递推方程

设置一个 L*L 的矩阵 D,D[i][j] 的值为 ture 或 false, 表示从 i 起始 j 终止的字符串是否为回文。
则有:

D[i][j] = (D[i] === D[j]) && D[i+1][j-1]
(若第 i 个字符与第 j 个字符相同,且从 i+1 起始 j-1 终止的字符串为回文,则有从 i 起始 j 终止的字符串也为回文)

解法

function handleStr(str) {
  let L = str.length
  let d = []
  for(let i=0;i<L;i++) { // 初始化矩阵D,且先将最小子问题1的情况都设置为true
    let arr = []
    arr[i] = true
    d[i] = arr
  }
  
  let maxLen = 1,
      resIndex = 0
  
  for(let i=0;i<L;i++) { // 再将最小子问题2的情况都设置为true
    if(str[i] === str[i+1]) {
      d[i][i+1] = true
      if(maxLen < 2) { // 如果最小子问题成立,则最长回文字符串为2
        maxLen = 2
        resIndex = i
      }
    }
  }
  
  
  for(let len=3;len<=L;len++) { // 从长度为3开始逐渐增长的检查回文字符串
    for(let i=0;i<L-len+1;i++) { // 从第0个位置开始,依据最小子问题1、2来依次检查回文字符串
      if(str[i] === str[i+len-1] && d[i+1][i+len-2]) {
        d[i][i+len-1] = true
        if(len > maxLen) { // 满足条件时,保存回文字符串长度和起始位置
          maxLen = len
          resIndex = i
        }
      }
    }
  }
  
  return str.substr(resIndex, maxLen)
}

相关文章

  • 【leetcode-动态规划】最长回文子串

    【leetcode-动态规划】最长回文子串 题目: 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s...

  • 最长回文子串

    最长回文子串——Manacher 算法 1. 问题定义 最长回文字符串问题:给定一个字符串,求它的最长回文子串长度...

  • Manacher's Algorithm算法分析Java

    Manacher's Algorithm俗称马拉车算法,对于求字符串中最长回文子串效率极高。 在求最长回文子串的时...

  • 【leetcode5】 5. Longest Palindrom

    关键字:动态规划、回文字符串 难度:Medium 题目大意:输出一个字符串的最长回文子串 题目: 解题思路: 思路...

  • 最长回文子串(两种方法)

    题目描述 给定一个字符串,求字符串的最长回文子串 解法 中心扩散法 动态规划法 中心扩散法从一个点出发,比较周围的...

  • Longest Palindrome Substring

    问题 求最长回文子串 思路 如果考虑O(n)的动态规划,比如用f(i)来代表以当前位置为结尾的回文子串的最大长度,...

  • 最长回文子串

    问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度。 解法1:暴力解法 找到字符串的所有子串,判断...

  • LeetCode 5. 最长回文子串(Longest Palin

    5. 最长回文子串 切题 一、Clarification 求最长回文子串,这里有几个特殊情况需要考虑1、空字符串,...

  • 字符串---Manacher

    求最长回文子串 求一个串中的回文子串,首先将字符串处理成奇数个。如"abbc"处理成Ma = "$ a # b #...

  • 最长回文子串问题—Manacher算法

    最长回文串问题是一个经典的算法题。 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度。如果...

网友评论

      本文标题:求字符串的最长回文子串(动态规划)

      本文链接:https://www.haomeiwen.com/subject/qaqkpqtx.html