找出最长的神奇数列
题目分析
我们需要在一个由 0 和 1 组成的字符串中找到最长的「神奇数列」。神奇数列的定义是:
- 由
0和1交替出现。 - 至少包含 3 个连续的
0和1。
算法步骤
- 遍历字符串:从字符串的第一个字符开始,逐个检查字符。
- 检查交替模式:对于每个字符,检查它是否与前一个字符不同,如果是,则继续检查下一个字符,直到找到一个不符合交替模式的字符。
- 记录最长神奇数列:在检查过程中,如果发现一个符合条件的子串(长度至少为3且交替出现),则记录其长度和起始位置。
- 更新最长神奇数列:如果当前找到的神奇数列比之前记录的最长神奇数列更长,则更新最长神奇数列。
- 返回结果:遍历结束后,返回最长的神奇数列。
代码+分析
-
solution方法:- 遍历输入字符串
inp,通过start指针和end指针来检查和扩展每个交替子串。 - 每当发现一个交替子串时,判断其长度是否大于 3,并且是否比当前的最大子串更长,如果是,就更新最大子串。
- 如果一个字符和下一个字符不交替,就跳过该部分,继续检查下一个字符。
- 遍历输入字符串
-
main方法:- 提供了一些基本的测试用例来验证代码是否正确。
- 每个测试用例使用
solution方法进行计算,并通过.equals方法确保返回值是预期的。
测试用例分析:
-
solution("0101011101").equals("010101"):- 输入字符串 "0101011101" 中,最长的交替子串是 "010101"。该子串长度大于等于 3,因此返回正确的子串。
-
solution("1110101010000").equals("10101010"):- 在字符串 "1110101010000" 中,最长的交替子串是 "10101010",它符合交替模式,且长度大于 3。
-
solution("1010101010101010").equals("1010101010101010"):- 该字符串本身就是一个由 0 和 1 完全交替组成的神奇数列,返回整个字符串。
-
solution("0000").equals(""):- 这个测试用例没有交替字符,返回空字符串。
-
solution("010").equals("010"):- 最短的神奇子串长度为 3,符合要求,返回 "010"。
-
solution("111000").equals(""):- 该字符串没有交替字符,因此返回空字符串。
复杂度分析:
- 时间复杂度:
O(n),其中n是字符串的长度。我们只遍历了一次字符串,并通过start和end指针扩展每个交替子串。 - 空间复杂度:
O(1),仅使用常数级别的空间来存储最大长度和子串。
总结:
这个实现通过遍历字符串并扩展每一个交替子串,能够高效地找到最长的交替子串,且符合问题的要求。