最长回文子串澄清

Posted

技术标签:

【中文标题】最长回文子串澄清【英文标题】:Longest Palindromic Substring clarification 【发布时间】:2017-02-28 01:37:11 【问题描述】:

方法 #3(动态编程)[接受]

为了改进蛮力解决方案,我们首先观察我们如何能够 在验证回文时避免不必要的重新计算。 考虑一下''ababa''的情况。如果我们已经知道 ''bab'' 是回文,显然''ababa'' 肯定是回文,因为左右两端 字母是一样的。

这产生了一个直接的 DP 解决方案,我们首先对其进行初始化 一个和两个字母的回文,并努力找到所有 三个字母回文,等等……

复杂性分析

时间复杂度:O(n^2) 这给了我们一个运行时间 O(n^2) 的复杂度。

空间复杂度:O(n^2)。它使用 O(n^2) 空间 存储表格。

我在网上阅读了上述解决此问题的方法,并对此有一些疑问(如果这不是发帖的正确论坛,请告诉我)。这是我对如何解决这个问题的理解:保存所有单字符回文。然后对于其中的每一个,如果左侧的字符等于右侧的字符,请保留它。如果不满足该条件,请停止处理此子字符串。继续这个直到结束。

这是正确的吗?如果是这样,这如何转化为 O(N^2) 算法?是不是因为在最坏的情况下,我们必须遍历字符串 N 次才能将每个潜在回文数增加一个字符?这部分对我来说并不直观。

【问题讨论】:

【参考方案1】:

你的解释是正确的。 在最坏的情况下,我们需要检查所有长度增加的子字符串。我们首先检查所有长度为 1 的子串,然后检查所有长度为 3 的子串,依此类推。此外,我们还需要考虑"abba" 类型的回文,因此我们还需要检查所有长度相等的候选。所以在最坏的情况下,我们需要验证给定输入字符串的每个可能的子字符串。

长度为n的给定字符串的子字符串总数为n(n + 1)/2

n * (n + 1) / 2 = n ^ 2 / 2 + n / 2 = O(n ^ 2)

可以在O(1) 中对回文进行单个验证步骤,因此总运行时间为O(n ^ 2)

【讨论】:

为什么回文的验证步骤是 O(1)?它不需要遍历潜在回文的字符吗? @Sunny 由于您使用 DP 验证回文,您已经知道长度为 n 的子字符串是回文的,并基于此验证长度为 n + 2 的子字符串是回文的。所以单个验证步骤只需要比较两个字符,即O(1)

以上是关于最长回文子串澄清的主要内容,如果未能解决你的问题,请参考以下文章

最长回文子序列(不连续)以及最长回文子串(连续)

LeetCode-005-最长回文子串

最长回文子串--动态规划

求最长回文子串,O(n)复杂度

回文子串解法大全

求最长回文子串,O(n)复杂度