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; }