青训营—找出最长的神奇序列

86 阅读2分钟

题目描述

小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一个神奇数列,而 1011 不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?

如果有多个神奇数列,那么输出最先出现的一个。

测试样例

样例1

输入:inp = "0101011101"
输出:'010101'

样例2

输入:inp = "1110101010000"
输出:'10101010'

样例3

输入:inp = "1010101010101010"
输出:'1010101010101010'

思路

  1. 遍历字符串:可以通过遍历字符串来检查 01 的交替情况。
  2. 记录长度:在遍历过程中,需要记录当前的交替长度,并在遇到相同字符时检查当前的交替长度是否大于等于 3。
  3. 更新最大值:如果当前的交替长度大于已记录的最大长度,则更新最大长度和对应的子串。
  4. 边界处理:在遍历结束后,还需要检查最后一段交替序列是否满足条件。

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),不依赖于输入大小。