我(菜鸡)的想法是先从起始点开始扫描然后直到有字母达到k个 达不到就输出-1
用数组储存字符个数 用ans记录最短长度
然后维护这一子串 从起始点开始删减字符 直到不满足 从终止点添加字符直到满足
如此重复
这样把字符串走完 最短长度就出来了
蒟蒻的代码 #include <bits/stdc++.h> #define ll long long using namespace std; ll n,k; ll q[1000]; string a; ll ff() { for(int i='a';i<='z';++i) if(q[i]==k) return 1; return 0; } int main() { cin>>n>>k>>a; ll len=0; ll lenmin=1e10; ll kk=1; ll l,r=0; for(int i=0;i<n;++i) { q[a[i]]++; len++; if(ff()){l=i;break;} } if(!ff()){cout<<-1<<endl;return 0;} lenmin=len; while(l<n) { if(ff()) { lenmin=min(len,lenmin); q[a[r]]--; r++; len--; } else { l++; q[a[l]]++; len++; } } cout<<lenmin<<endl; return 0; }