[ACdream]女神教你字符串——违和感

题目描述:

女神最喜欢字符串了,字符串神马的最有爱了。

女神是一个重度强迫症患者,面对不是对称的东西,她会觉得太违和了,就会爆炸。所以她手上的字符串都是回文的,像什么a,b,aabaa,abcba,上海自来水来自海上...等等。

女神的人生理想就是把所有字符串都改造成回文串!这是非常宏伟的理想。

一切理想都从最简单的开始。

好了,现在女神面前有一堆字符串,然后请问能否通过删去一个字符,使这个字符串变成回文串?

Input

多组数据,每组数据是一个字符串S,仅有英文小写字母组成

1<=|S|<=100000

Output

对于每组数据,若可以通过删除一个字符来变成回文串,则输出该字符的下标,若不能或不需要删除,请输出-1

Sample Input

aaab
baa
aaa

Sample Output

3
0
-1

解题思路:
这题折腾我好久,个人因为一些特殊的情况漏掉了,导致提交一直错误,我的做法步骤是,1、判断不删除字符是不是符合,2、去掉第一个字符是不是符合,3、去掉最后一个字符是不是符合,4、用一个i、j标记首位的下标,找到不相等的位置,开始判断,如果i的位置等于len/2,需要删除的字符位置就是i,如果不是就要分4种情况来判断了,第一种就是s[i+1]==s[j]&&s[i]==s[j-1],第二种s[i+1]!=s[j]&&s[i]==s[j-1],第三种s[i+1]==s[j]&&s[i]!=s[j-1]第四种s[i+1]!=s[j]&&s[i]!=s[j-1],用if来解决。

AC代码:
#include<iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int flag,sum;
char s[100005];

int judge1(int si,int sj,int m)
{
    int i,j;
    for(i=si,j=sj; i<m; i++,j--)
    {
        if(s[i]!=s[j]) return 0;
    }
    return 1;
}
int main()
{
    int len,i,j,m;
    while(scanf("%s",s)!=EOF)
    {
        sum=0;
        len=strlen(s);
        m=len/2;
        if(judge1(0,len-1,m))
        {
            printf("-1
");continue;
        }
        if(len%2==1)
        {
            if(judge1(1,len-1,m+1))
            {
               printf("0
");continue;
            }
            if(judge1(0,len-2,m-1))
            {
                printf("%d
",len-1);continue;
            }
        }
        if(len%2==0)
        {
            if(judge1(1,len-1,m))
            {
               printf("0
");continue;
            }
            if(judge1(0,len-2,m))
            {
                printf("%d
",len-1);continue;
            }
        }

        for(i=0,j=len-1; i<m; i++,j--)
        {
            if(s[i]!=s[j])
            {
                if(i!=m)
                {
                    if(s[i+1]==s[j]&&s[i]!=s[j-1])
                    {
                        if(len%2==1) m++;
                        if(judge1(i+1,j,m)==1)
                        {
                            sum=1;
                            flag=i;
                        }
                    }
                    else if(s[i+1]!=s[j]&&s[i]==s[j-1])
                    {
                        if(!judge1(i,j-1,m)) break;
                        else
                        {
                            sum=1;
                            flag=j;
                        }
                    }
                    else if(s[i+1]==s[j]&&s[i]==s[j-1])
                    {
                        int mm=m,mm2=m;
                        if(len%2==1) mm++;
                        if(!judge1(i+1,j,mm))
                        {
                            if(!judge1(i,j-1,mm2)) break;
                            else
                            {
                                sum=1;
                                flag=j;
                            }
                        }
                        else
                        {
                            sum++;flag=i;
                        }
                    }
                }
                else
                {
                    sum=1;
                    flag=i;
                }
                break;
            }

        }
        if(sum==1) printf("%d
",flag);
        else printf("-1
");
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/gaojupeng/p/4480292.html