首先要明白,子序列不一定要所有元素挨在一起!
子串当然就是要再在一起啦,就像一串糖葫芦一样,被串在一起了。
但是,这道题要求的 “最长连续子序列” 就是 “子串” 。
#include
using namespace std;
const int N = 1e6 + 10;
int n;
int a[N];
bool s[N];
int cnt = 0, t = 0;
int main(){
//初始化
memset(s, 0, sizeof s);
cin >> n;
for(int i = 0; i < n; i ++)
cin >> a[i];
for(int i = 0, j = -1; i < n; i ++){
//i不断往后走
//每一轮都要找到从i开始的最长不重复子序列
//如果当前有长度,往后走就要长度-1
if(t > 0)
t --;
//下一位存在且上面的元素没有出现过 :加进去
while(j + 1 < n && !s[a[j + 1]]){
s[a[j + 1]] = 1;
//长度加一
t ++;
//往后挪一位
j ++;
}
//更新最大子串长度
cnt = max(cnt, t);
//下一轮当前的第i位元素就要被弹出了
s[a[i]] = 0;
}
cout << cnt;
return 0;
}