string getMin(string s){
int n=s.size();s="!"+s;
char minl='z';
for(int i=1;i<=n;i++)minl=min(minl,s[i]);
if(s[1]==minl){
string tmp;tmp+=minl;
return tmp;
}
string ans;
for(int i=n;i>=1;i--){
if(s[i]==minl){
if(ans.empty())ans=s.substr(i,n-i+1);
else ans=min(ans,s.substr(i,n-i+1));
}
}
return ans;
}
void solve(){
int n;cin>>n;
string s;cin>>s;s="!"+s;
string ans="";
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
string x=s.substr(1,i-1)+s.substr(j+1,n-j);//此处枚举删除每一个字串后 剩下的字符串的计算结果
if(x.empty())continue;
x=getMin(x);
if(ans.empty())ans=x;
else ans=max(ans,x);
}
}
string x=s.substr(1,n);
x=getMin(x);
if(ans.empty())ans=x;
else ans=max(ans,x);
cout<<ans<<endl;
}
暴力解法,首先先手尝试每一种删除方法,后手要在每种可能下找到对应的字典序最小的串,那么先手的每种删法就都对应着唯一一种结果,只要找到最小的结果即可;
对于后手,他所需要做到是使字符串最小,那么结果字符串的第一个字符必然是最小的字符,因此如果第一位就是最小的,只要将后面的全部删除即可,否则,就比较所有最小字符所在下标的后缀字符串,找出最小的即可(因为要将最小字符排在第一位,而只能删除一个字串,所以要将他的前缀删除了)

京公网安备 11010502036488号