青训营豆包 | 豆包MarsCode AI 刷题

61 阅读3分钟

找出最长的神奇数列

题目分析

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

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

算法步骤

  1. 遍历字符串:从字符串的第一个字符开始,逐个检查字符。
  2. 检查交替模式:对于每个字符,检查它是否与前一个字符不同,如果是,则继续检查下一个字符,直到找到一个不符合交替模式的字符。
  3. 记录最长神奇数列:在检查过程中,如果发现一个符合条件的子串(长度至少为3且交替出现),则记录其长度和起始位置。
  4. 更新最长神奇数列:如果当前找到的神奇数列比之前记录的最长神奇数列更长,则更新最长神奇数列。
  5. 返回结果:遍历结束后,返回最长的神奇数列。

代码+分析

f1ba19996928a0683935a8f93a17e81.png

7e2c60bc61121029bf20e640702d8d2.png

  1. solution 方法

    • 遍历输入字符串 inp,通过 start 指针和 end 指针来检查和扩展每个交替子串。
    • 每当发现一个交替子串时,判断其长度是否大于 3,并且是否比当前的最大子串更长,如果是,就更新最大子串。
    • 如果一个字符和下一个字符不交替,就跳过该部分,继续检查下一个字符。
  2. main 方法

    • 提供了一些基本的测试用例来验证代码是否正确。
    • 每个测试用例使用 solution 方法进行计算,并通过 .equals 方法确保返回值是预期的。

测试用例分析:

  1. solution("0101011101").equals("010101") :

    • 输入字符串 "0101011101" 中,最长的交替子串是 "010101"。该子串长度大于等于 3,因此返回正确的子串。
  2. solution("1110101010000").equals("10101010") :

    • 在字符串 "1110101010000" 中,最长的交替子串是 "10101010",它符合交替模式,且长度大于 3。
  3. solution("1010101010101010").equals("1010101010101010") :

    • 该字符串本身就是一个由 0 和 1 完全交替组成的神奇数列,返回整个字符串。
  4. solution("0000").equals("") :

    • 这个测试用例没有交替字符,返回空字符串。
  5. solution("010").equals("010") :

    • 最短的神奇子串长度为 3,符合要求,返回 "010"。
  6. solution("111000").equals("") :

    • 该字符串没有交替字符,因此返回空字符串。

复杂度分析:

  • 时间复杂度O(n),其中 n 是字符串的长度。我们只遍历了一次字符串,并通过 start 和 end 指针扩展每个交替子串。
  • 空间复杂度O(1),仅使用常数级别的空间来存储最大长度和子串。

总结:

这个实现通过遍历字符串并扩展每一个交替子串,能够高效地找到最长的交替子串,且符合问题的要求。