如何解决查找给定字符串的所有前缀的最长回文子字符串的长度
我遇到了寻找最长回文子串的问题,但这是不同的。 给定类似“ ababa”的字符串, all 的最长回文子字符串的长度将如下所示-
- “ a”:“ a”(长度1)
- “ ab”:“ a”或“ b”(长度1)
- “ aba”:“ aba”(长度3)
- “ abab”:“ aba”或“ bab”(长度3)
- “ ababa”:“ ababa”(长度5)
这是示例输入/输出->
- 示例输入:“阿巴巴”
- 示例输出:1 1 3 3 5
我考虑了几种解决方案-
- 找出给定字符串的所有回文子字符串(使用中心展开法O(N ^ 2)),然后为每个前缀找出其是否包含子字符串(按长度的降序排列)。这似乎比O(N ^ 3)还差。
- 对于每个前缀,使用Manacher算法(O(N))查找最长回文子串。将有N个前缀,所以这是O(N ^ 2)。
我们只需要长度,而不需要实际回文。有什么更容易/更好的方法(就运行时复杂性而言),我错过了吗?
更新:我们需要字符串的所有前缀的长度(最长回文子字符串)(如上例所示)。
解决方法
第二个选项。考虑经理的工作方式。每次它向右移动指针时,它基本上都会考虑一个新的前缀。在每次迭代中,跟踪管理器表值的当前计算部分中的最大值,该迭代是当前前缀的最长回文子序列的长度(在右指针上结束)。这需要O(n)时间。
,我建议使用以下解决方案:https://www.geeksforgeeks.org/longest-palindromic-substring-set-2/?ref=rp,其时间复杂度为O(N ^ 2),空间复杂度为O(1)。 但是在您的情况下,您需要一个数组(maxArr)来保存前缀的最大长度子字符串的长度
想法保持不变,您选择一个中心并找到以该中心为中心的最大长度子串。 max子字符串将结束的位置,更新该位置数组中的最大长度。 最后,您可能在array(maxArr)中的某些位置为空,这些位置将保持与它们的左侧位置相同的值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。