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

暴力解法,首先先手尝试每一种删除方法,后手要在每种可能下找到对应的字典序最小的串,那么先手的每种删法就都对应着唯一一种结果,只要找到最小的结果即可;

对于后手,他所需要做到是使字符串最小,那么结果字符串的第一个字符必然是最小的字符,因此如果第一位就是最小的,只要将后面的全部删除即可,否则,就比较所有最小字符所在下标的后缀字符串,找出最小的即可(因为要将最小字符排在第一位,而只能删除一个字串,所以要将他的前缀删除了)