[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\n");continue; } if(len%2==1) { if(judge1(1,len-1,m+1)) { printf("0\n");continue; } if(judge1(0,len-2,m-1)) { printf("%d\n",len-1);continue; } } if(len%2==0) { if(judge1(1,len-1,m)) { printf("0\n");continue; } if(judge1(0,len-2,m)) { printf("%d\n",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\n",flag); else printf("-1\n"); } return 0; }