【问题标题】:Find the longest non-palindromic substring in a string查找字符串中最长的非回文子串
【发布时间】:2016-08-01 17:28:54
【问题描述】:

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

我可以想出简单的蛮力算法,找到所有可能的子串 (O(n ** 2)),然后对每个这样的子串检查它是否是回文 (O(n)),取整体复杂度为 O(n**3)。

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

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

【问题讨论】:

  • 提示:如果你从回文中删除第一个字符,你会得到一些不是回文的东西——除了一个很容易检测到的非常特殊的情况。
  • 什么是非回文子串?一个本身不是完整回文的子串?因为在那种情况下,问题听起来很简单。试着用一些例子在纸上解决它。
  • 已编辑问题。是的,简,我知道。具体的设置是困扰我的。
  • 为什么那个特定的设置困扰着你?告诉我,你觉得这个系列是什么?
  • 据我所知,有多种方法可以从最长的回文子字符串中获取非回文子字符串 - 在开头或结尾添加字符,从开头删除字符,或从头开始,或两者兼而有之。想不通。

标签: string algorithm palindrome


【解决方案1】:

既然已经发布了答案,让我把我的提示变成一个实际的答案:

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

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

然后:

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

【讨论】:

  • 嗯,没错。这看起来很完整。让我看看有没有遗漏的情况。
【解决方案2】:

让 s,e 成为字符串中的位置。

您可以通过检查string[s] == string[e] 和子字符串 s+1, e-1 来判断子字符串 s,e 是否为回文(特殊情况下单个字符 s==e 和空字符串s>e 为真)。

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

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

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

【讨论】:

    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多