问题描述
小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一个神奇数列,而 1011 不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?
如果有多个神奇数列,那么输出最先出现的一个。
问题理解
我们需要在一个由 0 和 1 组成的字符串中找到最长的「神奇数列」。神奇数列的定义是:
- 由
0和1交替出现。 - 至少包含 3 个连续的
0和1。
数据结构选择
由于我们处理的是字符串,可以直接使用字符串操作。
算法步骤
- 遍历字符串:从字符串的第一个字符开始,逐个检查字符。
- 检查交替模式:对于每个字符,检查它是否与前一个字符不同,如果是,则继续检查下一个字符是否与当前字符不同,以此类推。
- 记录最长神奇数列:如果发现一个符合条件的子串,记录其长度和起始位置。
- 返回结果:遍历结束后,返回最长的神奇数列。
关键点
- 如何判断一个子串是否符合交替模式。
- 如何记录和更新最长神奇数列的起始位置和长度。
好的,让我们基于你当前的代码框架来提供一些代码提示。
代码提示
public class Main {
public static String solution(String inp) {
// 初始化变量来记录最长神奇数列的起始位置和长度
int maxStart = 0;
int maxLength = 0;
// 遍历字符串
for (int i = 0; i < inp.length(); i++) {
// 检查是否满足交替模式
int currentLength = 1;
while (i + currentLength < inp.length() &&
inp.charAt(i + currentLength) != inp.charAt(i + currentLength - 1)) {
currentLength++;
}
// 如果当前长度大于3,并且比之前记录的最长长度更长,更新最长神奇数列
if (currentLength >= 3 && currentLength > maxLength) {
maxStart = i;
maxLength = currentLength;
}
// 跳过已经检查过的部分
i += currentLength - 1;
}
// 返回最长的神奇数列
return inp.substring(maxStart, maxStart + maxLength);
}
public static void main(String[] args) {
// 添加你的测试用例
System.out.println(solution("0101011101").equals("010101"));
System.out.println(solution("1110101010000").equals("10101010"));
System.out.println(solution("1010101010101010").equals("1010101010101010"));
}
}
关键步骤解释
- 初始化变量:
maxStart和maxLength用于记录最长神奇数列的起始位置和长度。 - 遍历字符串:使用
for循环遍历字符串。 - 检查交替模式:使用
while循环检查当前字符是否与前一个字符不同,并计算当前子串的长度。 - 更新最长神奇数列:如果当前子串的长度大于3且比之前记录的最长长度更长,更新
maxStart和maxLength。 - 跳过已检查部分:在
for循环中跳过已经检查过的部分。 - 返回结果:使用
substring方法返回最长的神奇数列。