方法#3(动态规划)[已接受]
为了改善蛮力解决方案,我们首先要观察我们的情况 在验证回文时避免不必要的重新计算。 考虑一下''ababa''。如果我们已经知道了 ''bab''是一个回文,显然''ababa''必须是回文,因为左右两个结尾 字母是一样的。
这产生了一个直接的DP解决方案,我们首先进行初始化 一个和两个字母的回文,并努力找到所有 三个字母回文,等等...
复杂性分析
时间复杂度:O(n ^ 2)这给了我们运行时间 O(n ^ 2)的复杂性。
空间复杂度:O(n ^ 2)。它使用O(n ^ 2)空间 存储表。
我在网上阅读了上述问题的解决方案,并对此有一些疑问(如果这不是正确的论坛发帖请告诉我)。这是我对如何解决这个问题的理解:保存所有的一个char-palindromes。然后对于其中的每一个,如果左边的字符等于右边的字符,请保留它。如果不满足该条件,则停止处理此子字符串。继续这样直到结束。
这是对的吗?如果是这样,这如何转化为O(N ^ 2)算法?是因为,在最坏的情况下,我们必须通过字符串N次来将每个潜在的回文增加一个字符?这部分对我来说不直观。
答案 0 :(得分:0)
您的解释是正确的
在最坏的情况下,我们需要检查所有子串的长度增加。我们首先检查长度为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)
。