1215: I Wanna Be A Palindrome
时间限制: 2 Sec 内存限制: 128 MB提交: 148 解决: 22
[ 提交][ 状态][ 讨论版]
题目描述
给出一个字符串,仅由小写字母组成。请找出是否仅删除其中的一个字母之后, 字符串变成回文串。
输入
输入第一行是一个整数 T,表示有 T 组数据。 每组数据占一行,每行包含一个非空字符串,字符串长度不超过 105 。
输出
对于每组测试数据,输出一行包含一个整数 K ,表示删除字符串中第 K 个字 母后字符串变成回文串。若有多个这样的整数 K 存在,则输出其中最小的一个 整数。如果输入的字符串原本就是一个回文串,或者找不到这样的整数,则输出 "No Solution" (不包含引号)。
样例输入
3
aaab
abab
abcba
样例输出
4
1
No Solution
提示
思路:从两边向中间扫,遇到不同的字符就按两种情况删除,但要注意不一定删除这两个不同的字符才能达到回文,也有可能是删除其他字符,比如abbcxcba 答案是2,不是3
这种情况YY一下,只有字符相同情况才会发生,所以向前枚举即可
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5+100;
char a[N];
bool judge(int x,int y)
{
int l=0;
while(x+l<=y-l)
{
if( a[x+l]==a[y-l] ) l++;
else return false;
}
return true;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
bool flag=0;
scanf("%s",a+1);
int len=strlen(a+1);
for(int i=1;i<=len;i++)
{
if( a[i]==a[len-i+1] ) continue;
int j=i;
while(a[j-1]==a[i]) j--;
for(int k=j;k<=i;k++)
if( judge(k+1,len-k+1) )
{
printf("%d\n",k);
flag=1;
break;
}
if(flag) break;
if( judge(i,len-i) )
{
printf("%d\n",len-i+1);
flag=1;
break;
}
break;
}
if(!flag) printf("No Solution\n");
}
return 0;
}