题意 :
- 给一字符串,问能否删除若干个同一个字符使得其成为回文串,不能则输出-1,能则输出最少方案
思路 :
- 模拟,枚举删除每个出现过的字母,然后双指针一最左一最右,当指针所指两个字母相等,都前进;当不相等,但其中一个等于要删除的字母,说明这个位置应删除;当不相等,且都不等于要删除的字母,说明方案不可行
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <unordered_set>
using namespace std;
typedef long long ll;
int n;
string str;
int check(char wo)
{
int i = 0, j = n - 1;
int cnt = 0;
while (i < j)
{
if (str[i] == str[j]) i ++ , j -- ;
else if (str[i] == wo) cnt ++ , i ++ ;
else if (str[j] == wo) cnt ++ , j -- ;
else return 1e9;
}
return cnt;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int _;
cin >> _;
while (_ -- )
{
cin >> n >> str;
unordered_set<char> se;
int mi = 1e9;
for (int i = 0; i < str.size(); i ++ )
se.insert(str[i]);
for (auto wo : se)
mi = min(mi, check(wo));
cout << (mi == 1e9 ? -1 : mi) << endl;
}
return 0;
}