最长回文子串澄清
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)
。以上是关于最长回文子串澄清的主要内容,如果未能解决你的问题,请参考以下文章