小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一个神奇数列,而 1011 不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?
这是AI刷题的一题,我们可以用暴力法解,即从头到尾遍历字符串,这个不再赘述; 也可以用双指针法去解,双指针法的直观想法很简单:
使用一个快指针和一个慢指针遍历数组
快指针的职责:往后遍历新数组元素,相当于工作指针
慢指针的职责:原地更新数组的数据构成,帮助快指针实现数组重复元素覆盖的工作
在这题中,2个指针分别指向嫌疑神奇序列的左端和右端,右端指针如果察觉到右边的数字仍然满足条件(数字交替),则继续往右边扩展。如果不满足条件,左右指针会进行更新,寻找新的嫌疑神奇序列。
由于题目涉及到“最大”,所以搜索期间需要用maxlen和一个maxstring来记录当前最长的神奇序列。
需要注意的是当j遍历到最后一个元素时,maxlen和maxstring还没来得及保存就跳出循环了,所以需要在while循环结束时再检查一下。
public static String solution (String inp) {
if(inp.length()<2)
return "";
int i=0;
int j=i+1;
//遍历一遍
int mlen=Integer.MIN_VALUE;
String res="";
int len=1;
while(j<inp.length())
{
if(inp.charAt(j) != inp.charAt(j-1))
{
len++;
j++;
}
else
{
//先保存现有结果
if(mlen<len && len>=3)
{
mlen=len;
res=inp.substring(i, j);
}
//重新开始
len=1;
i=j;
j=i+1;
}
}
//处理最后一个元素
if(mlen < len&&len>=3) {
mlen = len;
res = inp.substring(i, j);
}
return res;
}
力扣上还有其他相关的题,如:
1、给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
2、给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
3、给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。