bluecode-找出最长的神奇数列

23 阅读1分钟

问题描述

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

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


测试样例

样例1:

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

样例2:

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

样例3:

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

#include <iostream>
#include <string>

using namespace std;

std::string solution(const std::string &inp) {
  int n = inp.size();
  if (n < 3) {
    return "";
  }

  int max_len = 0;
  int max_start = 0;
  int start = 0;

  for (int end = 1; end < n; ++end) {
    if (inp[end] == inp[end - 1]) {
      int current_len = end - start;
      if (current_len >= 3 && current_len > max_len) {
        max_len = current_len;
        max_start = start;
      }
      start = end;
    }
  }

  // Check the last window
  int current_len = n - start;
  if (current_len >= 3 && current_len > max_len) {
    max_len = current_len;
    max_start = start;
  }

  if (max_len >= 3) {
    return inp.substr(max_start, max_len);
  } else {
    return "";
  }
}

int main() {
  // Add your test cases here

  std::cout << (solution("0101011101") == "010101") << std::endl;
  return 0;
}