我已经花了一些时间来解决您的问题。我想出了一个算法。以下是详细信息。
概念
我们将使用两种方法:
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)时间,其中n是high-low+1。
重复关系将是:
T(n) = 2T(n/2) + O(n)
这导致时间复杂度为O(n*logn)。
最后的想法
我没有提供maxCrossingSubstring 方法的完整实现。 你应该尝试自己做。如果您遇到任何问题,请发表评论,我也会完成它。。如果您在理解算法的任何部分时遇到任何困难,请发表评论,我会更新我的答案以帮助您。
我认为可能有更快的算法来解决您的问题,它将在 O(n) 中运行。它将类似于Kadane's algorithm,因此它不是是分治算法。
希望我对你有所帮助。 我自己实现了这个算法,它对我来说确实适用于许多输入。如果有人发现它有什么问题。发表评论。