查找给定字符串的所有前缀的最长回文子串的长度

Posted

技术标签:

【中文标题】查找给定字符串的所有前缀的最长回文子串的长度【英文标题】:Finding the lengths of the longest palindromic substrings for all prefixes of a given string 【发布时间】:2020-08-22 05:30:49 【问题描述】:

我已经解决了寻找最长回文子串的问题,但这次不同。 给定一个像 "ababa" 这样的字符串,all 的最长回文子串的长度将如下所示 -

“a”:“a”(长度 1) “ab”:“a”或“b”(长度为 1) “aba”:“aba”(长度 3) “abab”:“aba”或“bab”(长度为 3) "ababa" : "ababa"(长度 5)

这是示例输入/输出 ->

示例输入:“ababa” 样本输出:1 1 3 3 5

我想了几个解决方案 -

    找出给定字符串的所有回文子字符串(O(N^2) 使用围绕中心展开的方法),然后对于每个前缀,找出它是否包含子字符串(按长度的降序排序)。这似乎比 O(N^3) 更糟。 对于每个前缀,使用 Manacher 算法 (O(N)) 找到最长的回文子串。会有 N 个前缀,所以这是 O(N^2)。

我们只需要长度而不需要实际的回文。有没有我错过的更简单/更好(就运行时复杂性而言)的方法?

更新:我们需要字符串所有前缀的长度(最长回文子字符串)(如上例所示)。

【问题讨论】:

您需要输出什么作为答案?回文数或最长回文子串数 “我们只需要长度”:复数?在你写的标题中,你只需要最长回文的长度,所以这将是一个奇异的结果。 @trincot,很抱歉造成混乱。所有前缀都需要它。例如对于前缀“abab”,它将是 3。对于“ababa”,它将是 5。 @SahanDissanayaka,需要所有前缀的长度。 @trincot,甚至标题都说我需要所有的长度。请检查我在问题中添加的示例输入/输出。 【参考方案1】:

第二个选项。想想manacher是如何工作的。每次它移动右指针时,它基本上都会考虑一个新的前缀。跟踪 manacher 表值的当前计算部分中的最大值,在每次迭代中,它是当前前缀的最长回文子序列的长度(在右指针处结束)。这需要 O(n) 时间。

【讨论】:

【参考方案2】:

我建议这个解决方案:https://www.geeksforgeeks.org/longest-palindromic-substring-set-2/?ref=rp,它的时间复杂度是 O(N^2),空间复杂度是 O(1)。 但是在您的情况下,您需要一个数组(maxArr)来保存前缀的最大长度子字符串的长度

想法保持不变,您选择一个中心并找到最大长度的子字符串作为中心。在最大子字符串将结束的位置,更新该位置的数组中的最大长度。 最后你可能在数组中有些位置是空的(maxArr),它们的值与它们的左侧位置相同。

【讨论】:

以上是关于查找给定字符串的所有前缀的最长回文子串的长度的主要内容,如果未能解决你的问题,请参考以下文章

编程之法:面试和算法心得(最长回文子串)

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

华为机试题 HJ85最长回文子串

华为机试题 HJ85最长回文子串

最长回文子串

华为机试HJ85:最长回文子串