#79. 最长无重复字符子串
描述
提交
自定义测试
【题目描述】:
给定一个长度为N的整数无序序列{a1,a2,…,ai,…,an},0<=ai<=100,000。找到连续的没有重复数字的最长子序列,并输出它的长度。例如:
{1 2 3 1 2 3 1 2 3 3 3}最长的没有重复数字的子序列是{1 2 3},长度是3。
{2 2 2 2 2 2} 最长的没有重复数字的子序列是{2},长度为1。
【输入描述】:
输入有多组测试,不超过10组,每组测试用例输入如下:
第一行,一个整数N表示原序列长度;
第二行,N个整数组成的序列;
【输出描述】:
对于每组测试用例,输出一行一个整数,表示子序列长度。
【样例输入】
11
1 2 3 1 2 3 1 2 3 3 3
6
2 2 2 2 2 2
【样例输出】
3
1
【数据范围及描述】:
时间:1s 空间:128M
1<=N<=100,000
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#define LL long long
using namespace std;
int n,a[100005],ans;
bool vis[100005];
void work(){
for(int i=1;i<=100000;i++)
vis[i]=false;
int p,q;p=1;q=2;ans=1;
vis[a[p]]=true;
while(q<=n){
while(!vis[a[q]] && q<=n){
vis[a[q]]=true;
++q;
}
ans=max(ans,p-q+1);
vis[a[p++]]=false;
}
printf("%d\n",ans);
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
work();
}
return 0;
}