找出最长的神奇数列 | 豆包MarsCode AI刷题

109 阅读3分钟

问题描述

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

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

问题理解

我们需要在一个由 0 和 1 组成的字符串中找到最长的「神奇数列」。神奇数列的定义是:

  • 由 0 和 1 交替出现。
  • 至少包含 3 个连续的 0 和 1

数据结构选择

由于我们处理的是字符串,可以直接使用字符串操作。

算法步骤

  1. 遍历字符串:从字符串的第一个字符开始,逐个检查字符。
  2. 检查交替模式:对于每个字符,检查它是否与前一个字符不同,如果是,则继续检查下一个字符是否与当前字符不同,以此类推。
  3. 记录最长神奇数列:如果发现一个符合条件的子串,记录其长度和起始位置。
  4. 返回结果:遍历结束后,返回最长的神奇数列。

关键点

  • 如何判断一个子串是否符合交替模式。
  • 如何记录和更新最长神奇数列的起始位置和长度。

好的,让我们基于你当前的代码框架来提供一些代码提示。

代码提示

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"));
    }
}

关键步骤解释

  1. 初始化变量maxStartmaxLength 用于记录最长神奇数列的起始位置和长度。
  2. 遍历字符串:使用 for 循环遍历字符串。
  3. 检查交替模式:使用 while 循环检查当前字符是否与前一个字符不同,并计算当前子串的长度。
  4. 更新最长神奇数列:如果当前子串的长度大于3且比之前记录的最长长度更长,更新 maxStartmaxLength
  5. 跳过已检查部分:在 for 循环中跳过已经检查过的部分。
  6. 返回结果:使用 substring 方法返回最长的神奇数列。