l과 r을 지정해서 경우에 따라 조정해가면서 문제를 풀어나간다.
s[l]과 s[r]이 다를 경우에는 왼쪽, 오른쪽 각각 하나씩 제거 해보면서 팰린드롬이 되는지 확인을 한다.
s[l]과 s[r]이 다를 경우에 각각 제거해서 확인한 후 cnt가 여전히 0이면 유사회문도 되지 않는 것이므로 2를 출력하고
cnt값이 2이상으로 쌓이면 그것또한 회문, 유사회문 둘다 되지 않으므로 2를 출력한다.
나머지는 cnt값에 따라 출력해주면 된다.
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<stack>
#include<map>
#include<memory.h>
#include<queue>
using namespace std;
bool isPalin(string s, int,int);
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while (T--)
{
string s;
cin >> s;
int l = 0, r = s.size() - 1;
int cnt = 0;
bool flag = false;
while (l <= r)
{
if (s[l] != s[r])
{
if (isPalin(s, l+1,r))
{
l++;
cnt++;
}
else if (isPalin(s, l,r-1))
{
r--;
cnt++;
}
if (cnt == 0)
{
cout << "2\n";
flag = true;
break;
}
}
else
{
l++;
r--;
}
if (cnt >= 2)
{
cout << "2\n";
break;
}
}
if (flag)
continue;
if (cnt == 1)
cout << "1\n";
else if(cnt== 0)
cout << "0\n";
}
}
bool isPalin(string s, int l, int r)
{
while (l < r)
{
if (s[l] != s[r])
return false;
l++;
r--;
}
return true;
}