https://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=315004
中文题意。
每次向前拓展,如果满足条件的话,对后面的一个一个递减,求最小的值。
(开始的策略是当前面遇到 和后面相同的字母在进行尺取蠕动。这样是不对的,因为之前可能前面的字母已经在串中出现了多次了qwq,所以正确的做法是统计次数)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/*尺取。向右边拓展,如果右边出现了 最左边出现的字母
那么他的 左端点就能 往右,(这个错了qwq)
*/
int mp[30];
string s;
bool ok(){
for(int i=0;i<26;i++)
if(!mp[i]) return false;
return true;
}
int main()
{ cin>>s;
memset(mp,0,sizeof(mp));
int l=0;
int r=0;
for(int i=0;i<s.length();i++){
if(!mp[s[i]-'A'])
mp[s[i]-'A']=1;
}
for(int i=0;i<26;i++){
if(!mp[i])
{puts("No Solution");return 0;}
}
int ans=1e6;
memset(mp,0,sizeof(mp));
for(int i=0;i<s.length();i++){
mp[s[i]-'A']++;r++;//向前
while(ok())
{ //cout<<l<<" "<<r<<endl;
mp[s[l]-'A']--;
ans=min(r-l,ans);//蠕动,
l++;
}
}
printf("%d\n",ans);
return 0;
}