字符串中交替字符的最长子串

Posted

技术标签:

【中文标题】字符串中交替字符的最长子串【英文标题】:Longest substring of alternating characters in a string 【发布时间】:2021-07-19 05:26:24 【问题描述】:

我一直在解决这个分而治之的问题,给定一个由小写字符组成的字符串,找到由连续 consonant, vowel 组成的最长子字符串及其在字符串上的位置。

示例。

字符串 = "ehbabebaehehehbe"

solution = "babeba" 位置:3

我尝试了很多东西,我发现了这些问题。

    我不知道在哪里拆分问题,因为我可能会拆分解决方案,然后合并子解决方案,解决方案可能会消失 合并子解决方案时,我不知道是应该合并它们还是选择其中之一,因为我不知道它们是否连续

【问题讨论】:

您可以使用类似于最大子数组和问题的方法。它确实有一种分而治之的方法。我认为这个问题和那个问题确实有一些相似之处。 分治算法是强制性的吗?因为也存在简单的 O(N) 解 是的,因为我正在练习 DyV 算法方法,它是强制性的。 【参考方案1】:

我已经花了一些时间来解决您的问题。我想出了一个算法。以下是详细信息。


概念

我们将使用两种方法:

1: int[] maxSubstringOfAlternatingCharacters(String string, int low, int high)

在这个方法中,我们简单地将字符串分成两部分。我们将从中间分割字符串。这个方法返回一个startIndex, substringLength形式的数组

2: int[] maxCrossingSubstring(String string, int low, int mid, int high)

在这个方法中,我们找到最大长度的子串,在低和高之间有交替的字符。此方法返回一个数组,格式为startIndex, substringLength


算法

方法一:

1:  int[] maxSubstringOfAlternatingCharacters(String string, int low, int high)
2:
3:      if (low == high) return low, 1
4:      
5:      mid = (low + high)/2
6:      leftSubstring = maxSubstringOfAlternatingCharacters(string, low, mid)
7:      rightSubstring = maxSubstringOfAlternatingCharacters(string, mid+1, high)
8:      crossingSubstring = maxCrossingSubstring (string, low, mid, high)
9:
10:     if leftSubstring[1] >= rightSubstring[1] and leftSubstring[1] >= crossingSubstring[1]
11:         return leftSubstring
12:     else if rightSubstring[1] >= leftSubstring[1] and rightSubstring[1] >= crossingSubstring[1]
13:         return rightSubstring
14:     else
15:         return crossingSubstring

方法二:

1:  int[] maxCrossingSubstring (String string, int low, int mid, int high)
2:
3:      if char[mid] and char[mid+1] are not alternating characters
4:          return low, 0;
5:
6:      leftMaxSubstring = 1;
7:      //Loop from mid to low to find leftMaxSubstring of alternating characters*/
8:      rightMaxSubstring = 1;
9:      //Loop from mid+1 to high to find rightMaxSubstring of alternating characters*/
10:     return mid-leftMaxSubstring+1, leftMaxSubstring+rightMaxSubstring

时间复杂度

除法步骤需要O(1)时间。 组合步骤,即找到最大交叉子串最坏需要O(n)时间,其中nhigh-low+1

重复关系将是:

T(n) = 2T(n/2) + O(n)

这导致时间复杂度为O(n*logn)


最后的想法

我没有提供maxCrossingSubstring 方法的完整实现。 你应该尝试自己做。如果您遇到任何问题,请发表评论,我也会完成它。。如果您在理解算法的任何部分时遇到任何困难,请发表评论,我会更新我的答案以帮助您。

我认为可能有更快的算法来解决您的问题,它将在 O(n) 中运行。它将类似于Kadane's algorithm,因此它不是分治算法

希望我对你有所帮助。 我自己实现了这个算法,它对我来说确实适用于许多输入。如果有人发现它有什么问题。发表评论。

【讨论】:

这是一个很好的回应。非常感谢,您对最大子数组的建议与我得出了类似的解决方案。另外,我之前提出了你在 O(n) 中提到的更快的算法,以寻找解决这个问题的想法。再次感谢您抽出宝贵时间。

以上是关于字符串中交替字符的最长子串的主要内容,如果未能解决你的问题,请参考以下文章

求两个字符串的最长公共子串,要求输入两个字符串,输出他们的最长公共子串,包括长度。

求两个输入的字符串的最长公共子串

两个字符串的最长公共子串python代码

寻找最长公共子串(高分)

最长公共子串

代码题(56)— 最长重复子串无重复字符的最长子串