binshenOJ 1215-I Wanna Be A Palindrome (YY)

1215: I Wanna Be A Palindrome

时间限制: 2 Sec   内存限制: 128 MB
提交: 148   解决: 22
[ 提交][ 状态][ 讨论版]

题目描述

给出一个字符串,仅由小写字母组成。请找出是否仅删除其中的一个字母之后, 字符串变成回文串。


输入

输入第一行是一个整数 T,表示有 组数据。 每组数据占一行,每行包含一个非空字符串,字符串长度不超过 10


输出

对于每组测试数据,输出一行包含一个整数 ,表示删除字符串中第 个字 母后字符串变成回文串。若有多个这样的整数 存在,则输出其中最小的一个 整数。如果输入的字符串原本就是一个回文串,或者找不到这样的整数,则输出 "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;
}


你可能感兴趣的:(binshenOJ 1215-I Wanna Be A Palindrome (YY))