赛时想到了主要做法,试字母却画蛇添足非要贪心那么一下,实际只要枚举每个字母就好了
详细思路:
因为删完肯定要剩一个字母类型,然后暴力枚举剩每一个字母的情况,然后我们把每个选中的字母看作一个隔离带,隔离带内删数字都是独立的,且删的次数越多可以删的字母越多,所以只要把最长子串删了其他子串都可以删完。
代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<queue>
#include<math.h>
using namespace std;
#define int long long
#define endl "\n"
#define lowbit(x) (x&(-x))
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
signed main(void){
int t;
cin>>t;
while(t--){
string a;
cin>>a;
map<char,int>b;//存a的所有字母类型
for(int i=0;i<a.size();i++)b[a[i]]++;
int ans=1e9;
for(auto i:b){//暴力遍历所有字母
int cnt=0,ma=0;
for(int j=0;j<a.size();j++){
if(a[j]!=i.first){
cnt++;
//cout<<a[j];
}
else{
ma=max(ma,cnt);
cnt=0;
}
}
ma=max(ma,cnt);//没有选定字母的最长子串长度
int temp=0;
while(ma>0){
ma/=2;
temp++;
}//把最长子串长度删完了其他子串也可以删完只剩选定字母
ans=min(temp,ans);
}
cout<<ans<<endl;
}
return 0;
}