题意:给定一个字符串S,从中删去一种任意个字符,删去后使得字符串成为回文字符串。如果存在多种方案,选用删除字母最少的哪一个。
思路:枚举26种字母,分别考虑他们的方案,利用双指针l和r。如果s[r]s[l]相等,则移动指针;如果不等,则有三种情况:
s[l]==op或者s[r]==op,则l++或者r--,增加删除字母数
s[l]s[r]均不等于op.则表明此字母无方案
代码如下
#include <iostream>
#include <string.h>
using namespace std;
typedef long long int ll;
string s;//双倍经验
int n,t,cmp=0,l,r,ans;//双指针
int min(int a,int b){
return a>b?b:a;
}
int main(){
cin>>t;
while(t--){
cin>>n;
cin>>s;
ans=11451419;
cmp=0;
l=0,r=n-1;
for(char op='a';op<='z';op++){
cmp=0;
l=0,r=n-1;//记得重置L和R
//cout<<op<<endl;
while(r>=l){
//cout<<l<<" "<<r<<endl;
if(s[r]==s[l]){
r--;l++;
}else{
if(s[r]==op){
cmp++;
r--;
}else if(s[l]==op){
cmp++;
l++;
}else{
cmp=1145149;
break;
}
}
}
ans=min(cmp,ans);
}
if(ans==1145149){
cout<<"-1\n";
}else{
cout<<ans<<endl;
}
}
return 0;
}