题目描述
小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一个神奇数列,而 1011 不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?
如果有多个神奇数列,那么输出最先出现的一个。
测试样例
样例1
输入:inp = "0101011101"
输出:'010101'
样例2
输入:inp = "1110101010000"
输出:'10101010'
样例3
输入:inp = "1010101010101010"
输出:'1010101010101010'
思路
- 遍历字符串:可以通过遍历字符串来检查
0和1的交替情况。 - 记录长度:在遍历过程中,需要记录当前的交替长度,并在遇到相同字符时检查当前的交替长度是否大于等于 3。
- 更新最大值:如果当前的交替长度大于已记录的最大长度,则更新最大长度和对应的子串。
- 边界处理:在遍历结束后,还需要检查最后一段交替序列是否满足条件。
Java代码
public class Main {
public static String solution(String inp) {
// Edit your code here
String maxList = "";
int maxLength = 0;
int n = inp.length();
int start = 0; // 记录当前交替序列的起始位置
int currentLength = 1; // 当前交替序列的长度
for (int i = 1; i < n; i++) {
if (inp.charAt(i) != inp.charAt(i - 1)) {
currentLength++; // 如果当前字符与前一个字符不同,长度加一
} else {
// 如果当前交替长度大于等于3,检查并更新最大值
if (currentLength >= 3) {
String candidate = inp.substring(start, i);
if (currentLength > maxLength) {
maxLength = currentLength;
maxList = candidate;
}
}
// 重置起始位置和当前长度
start = i;
currentLength = 1;
}
}
// 检查最后一段交替序列
if (currentLength >= 3) {
String candidate = inp.substring(start, n);
if (currentLength > maxLength) {
maxList = candidate;
}
}
return maxList;
}
public static void main(String[] args) {
// Add your test cases here
System.out.println(solution("0101011101").equals("010101"));
}
}
复杂度分析
时间复杂度:O(n),其中 n 是输入字符串的长度。只需遍历字符串一次,进行常数时间的操作。
空间复杂度:O(1),只使用了有限的额外空间来存储一些变量(如 maxList, maxLength, start, currentLength),不依赖于输入大小。