求数列最长连续不重复子序列 C++:
思路:
1、取窗口的开始位置为start
2、取滑动窗口从[start,i-1)
3、i在for循环中一直递加,并每次都和窗口中的字符a[j],start<=j<i进行比较,判断arr[j]==arr[i]
一旦遇到当前字符在之前的滑动窗口中存在,那么当前窗口的最长无重复子串的长度为 i-pre,
同时更新下一个滑动窗口的起始位置为 start = j+1
4、需要注意的是最后一个字符的处理,当最后一个字符不与滑动窗口中的值重复时,得不出此项字串长度,因此需要添加边界:如果arr[n-1] != arr[n-2]//(或者任意一个它之前的数字) out为n-start。
5、图示参考:https://www.bilibili.com/video/BV1TE411q7Yffrom=search&seid=16934468154723663534
下面是C++实现代码:
class Solution {
public:
int maxLength(vector<int>& a) {
// write code here
int pre = 0;
int out = 1;
int n = a.size();
if(n < 1 || n > 100000)
return -1;
for(int i = 1; i < n;i++)
{
for(int j = pre;j < i;j++)
{
if(a[i] == a[j])
{
if(out < (i-pre))
out = i - pre;
pre = j+1;
}
}
}
if(a[n-1] != a[n-2]){
if(out < n-pre)
out = n-pre;
}
return out;
}
};