题目介绍
问题描述
小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组成的正整数序列,并且在这个数组中0和1是交替出现,要求是至少有三个连续的0或者1就满足题目中要求的神奇数列的概念,当时被这个话迷惑了很久,甚至还让我一度质疑这个题目是否正确,其实就是说,数列中的0与1是不要要求交替出现的,但是这个神奇数列里面是要求交替出现,并且有至少三个!!这里的三个其实也没有写明白,其实是0与1加起来要超过三个,而不是0与1分别要三个,这个题目真的是可以改进一下,这也就是解释了为啥是10101是一个神奇数列,而1011不是。题目中要求输出第一个最长的神奇数列。
详细思路
数组其实全部都是遍历,我们还是按照遍历来处理,同时涉及到了子数组的问题,那么就需要利用到双指针来进行处理,对于数组,有一个索引为i,表示数组的开头,然后从左往右依次设计一个额外的指针索引j来模拟子数组的出现。那么按照i和j的移动,我们可以得到所有的子数组的情况,这里需要注意数组里面是字符串,要用到string类型的数据结构,判断是否是01交替,只需要确认相邻的两个元素是否一致就行。然后找到当时最长的数组,并且与全局变量进行比较,更新全局变量。当遍历完所有的情况的时候,这个时候全局变量中存储的就是答案。返回这个答案,那么这个问题就迎刃而解的。
需要注意的是,数组的初始初始长度要注意好,并且要满足3这种情况,同时如何确保输出的一定是第一个,这里就可以用到if (temp > lens) 进行判断,逻辑也很简单,如果我有两个数列都是满足最长的,第一个数列进来的时候就可以更新答案,因为他一定会比目前的len要长,但是第二个进来的时候发现他长度和第一个一样,就不会触发更新。
代码
std::string solution(const std::string &inp) {
// Edit your code here
int n = inp.size();
int lens = 2;
std::string res = "";
for (int i = 0; i < n; i++) {
int temp = 1;
std::string ans = "";
ans += inp[i];
for (int j = i + 1; j < n; j++) {
if (inp[j] != inp[j - 1]) {
temp++;
ans += inp[j];
} else {
break;
}
}
if (temp > lens) {
res = ans;
lens = temp;
}
}
return res;
}