删删 - 题目 - Daimayuan Online Judge
一个字符串,只能删除一种字符,可以删除一个两个甚至更多个,能否得到一个回文串,输出删除最小的个数
bilibili
回文串==>左右对称
只能删除一种字符==>确定删除哪种字符,最多也就26种,可以每种都试过去
删除的个数不限==>删除几个字符,假设要删掉某种字符,从左右两端往中间,如果不相等,则看是否可删,删掉后若还不相等,则不能
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
string s;
cin >> s;
int res = 1e9;
for (char m = 'a'; m <= 'z'; m++) {
bool flag = true;
int cnt = 0;
for (int i = 0, j = n-1; i <= j; i++, j--) {
while (s[i] != s[j]&&(s[i]==m||s[j]==m)) {
if (s[i] == m) {
i++;
cnt++;
}
else if (s[j]== m) {
j--;
cnt++;
}
}
if (s[i] != s[j]&&s[i]!=m&&s[j]!=m) {
flag = false;
break;
}
}
if (flag) res = min(res, cnt);
}
if (res == 1e9) cout << -1 << endl;
else cout << res << endl;
}
return 0;
}