给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数 n。
第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
1≤n≤105
输入样例:
5
1 2 2 3 5
输出样例:
3
一开始自己想的比较繁琐
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int num[N],a[N];//num数组存对应数的下标
int main()
{
int n;
cin >> n;
for(int i=1;i<=n;i++)
cin >> a[i];
int l=1,r=1;
int ans=0;
int ll,rr;
while(l<=n&&r<=n)
{
if(num[a[r]]==0)
{
num[a[r]]=r;
r++;
if(r-l>ans)
{
ans=r-l;
ll=l,rr=r;
}
}
else
{
l=num[a[r]]+1;
r=num[a[r]]+1;
memset(num,0,sizeof(num));
}
}
cout <<ans<<endl;
return 0;
}
更好的阅读体验,简洁的双指针
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int num[N],a[N];
int n;
int main()
{
cin >> n;
int len=0;
for(int i=1;i<=n;i++)
cin >>a[i];
int ll=1,rr=1;
while(rr<=n)
{
num[a[rr]]++;
while(num[a[rr]]>1)
{
num[a[ll]]--;
ll++;
}
len = max(rr-ll+1,len);
rr++;
}
cout <<len<<endl;
return 0;
}
给定一个字符串,请你求出其中的最长回文子串的长度。
例如,给定字符串 Is PAT&TAP symmetric?,最长回文子串为 s PAT&TAP s,其长度是 11。
输入格式
包含一个非空字符串。
输出格式
输出一个整数,表示给定字符串的最长回文子串的长度。
数据范围
给定字符串的长度不超过 1000。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
#include <bits/stdc++.h>
using namespace std;
string s,ss;
int main()
{
int len=0;
getline(cin,s);
for(int i=0;i<s.size();i++)
{
int r = i+1;
int l = i-1;
while(l>=0&&r<s.size()&&s[l]==s[r])
l--,r++;
len = max(len,r-l-1);
l=i,r=i+1;
while(l>=0&&r<s.size()&&s[l]==s[r])
l--,r++;
len = max(len,r-l-1);
}
cout <<len;
return 0;
}