String 最长回文子串澄清

String 最长回文子串澄清,string,algorithm,palindrome,String,Algorithm,Palindrome,方法3(动态规划)[已接受] 为了改进暴力解决方案,我们首先观察如何 在验证回文时避免不必要的重新计算。 考虑一下“ababa”这个例子。如果我们早知道的话 “bab”是一个回文,很明显,“ababa”必须是一个回文,因为两个左端和右端 字母是一样的 这将产生一个直接的DP解决方案,我们首先初始化它 这一个和两个字母是回文,我们努力找到所有的 三个字母回文,等等 复杂性分析 时间复杂度:O(n^2)这给了我们一个运行时 O(n^2)的复杂性 空间复杂度:O(n^2)。它使用O(n^2)空间 来存

方法3(动态规划)[已接受]

为了改进暴力解决方案,我们首先观察如何 在验证回文时避免不必要的重新计算。 考虑一下“ababa”这个例子。如果我们早知道的话 “bab”是一个回文,很明显,“ababa”必须是一个回文,因为两个左端和右端 字母是一样的

这将产生一个直接的DP解决方案,我们首先初始化它 这一个和两个字母是回文,我们努力找到所有的 三个字母回文,等等

复杂性分析

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

空间复杂度:O(n^2)。它使用O(n^2)空间 来存放桌子

我在网上阅读了上述解决方案,对此有一些疑问(如果这不是正确的论坛,请让我知道)。这是我对如何解决这个问题的理解:保存所有一个字符的回文。然后对于每一个,如果左边的字符等于右边的字符,则保留它。如果不满足该条件,请停止处理此子字符串。继续此操作直到到达终点


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

你的解释是正确的。
在最坏的情况下,我们需要检查所有长度不断增加的子字符串。我们首先检查长度为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)