找到字符串中最长的非回文子字符串

时间:2016-04-11 13:47:16

标签: string algorithm palindrome

我需要在字符串中找出最长的非回文子串(一个本身不是回文的字符串,无论是否有任何子串),在O(n ** 2)或更少时间。

我可以提出简单的强力算法,找到所有可能的子串(O(n ** 2)),然后对每个这样的子串检查是否是回文(O(n)),考虑到整体的复杂性到O(n ** 3)。

有O(n ** 2)个变种找出最长的回文子串和序列,但我无法重复使用它们来找出解决方案。

我如何在O(n ** 2)时间内完成?

2 个答案:

答案 0 :(得分:6)

由于已经发布了答案,让我将提示转化为实际答案:

首先,检查完整字符串是否为:

  • 回文(O(n),平均情况为O(1))
  • 重复相同的字符,例如" aaaaaaaaaaaa" (在同一个循环中完成)。

然后:

  • 如果字符串不是回文,那么最长的非回文子字符串就是字符串本身
  • 如果字符串是回文而不是相同字符的重复,则删除任一端将使其成为非回文,并且最长的这样的子字符串
  • 如果字符串是相同字符的重复,则它没有非回文子字符串。或者,根据您对回文结构的定义,唯一的非回文子字符串是空子字符串。

答案 1 :(得分:-2)

设s,e是字符串中的位置。

你可以通过检查string[s] == string[e]和子串s + 1,e-1也是palindrom(特殊情况下的单个字符s==e和空字符串{{1}来判断子字符串s,e是否为palindrom到真实)。

所以最简单的实现是如上所述制作递归函数并记住结果(将它们存储在外部矩阵中)。

如果您对迭代小心谨慎,也可以迭代地进行迭代(这样您只需要先前计算的结果)。

两者都将填充O(N ^ 2),并且单个计算是微不足道的。