C题:求无重复数字的子串个数
本题使用双指针算法,用hash来检验是否存在相同的数
双指针l,r我们先让r一直往右走直到出现重复元素,累加起始下标为l满足条件的子串个数,再将l往左走.
样例二模拟:
8 **
**2 12 3 12 3 2 6 9
初始l=r=1,未有重复元素
直到l=1,r=4时出现重复元素我们计算下标为l开始满足条件的子串{2}{2,12}{2,12,3}ans+=r-l
下一步将l左移l=2,r=4,还有重复元素满足条件子串{12}{12,3}ans+=r-l
如此l=3,r=4时无重复r继续往前走
将上述过程用代码实现
#include<bits/stdc++.h>
using namespace std;
long long num[100005];
int main()
{
int n;
long long a;//方案数很多
cin>>n;
for(int i=1;i<=n;i++)
scanf("%lld",&num[i]);
unordered_set<long long>mp;//哈希
int r=1;
a=0;
for(int i=1;i<=n;i++)
{
while(!mp.count(num[r])&&r<=n)//r往右走
{
mp.insert(num[r]);
r++;
}
//cout<<r<<" "<<i<<endl;
a+=r-i;
mp.erase(num[i]);
}
cout<<a;
}
京公网安备 11010502036488号