【ZZULIOJ】 2170 DML和回文

来源:互联网 发布:淘宝女童秋装 编辑:程序博客网 时间:2024/05/16 15:07

Description

DML有个只有小写字母的字符串。他想从字符串中更改一个字符,以便让这个字符串成为回文串。

回文串是一个字符串,从前往后读和从后往前读都相同,例如串 “z” “aaa” “aba” “abccba” 是回文串,但串 “acm” “ab”不是回文串。 

Input

输入一行字符串s(1<=|s|<=15)

输入到文件尾结束。

Output

如果DML可以正好更改一个字符,使得结果字符串为回文串,则输出“YES”, 否则 输出“NO”。

Sample Input

abccaa
abbcca
abcda

Sample Output

YES
NO
YES

HINT

     不能变换成和之前的字符一样,题目没说,wa了好多次...

AC代码:
#include<cstdio>#include<cstring>int main(){char s[20],a[10],b[10];while(scanf("%s",s)!=EOF){int len=strlen(s);if(len==1)  //一个字符变换后还是回文串 {printf("YES\n");continue;}if(len==2)   //2个字符 {if(s[0]==s[1])  //aa变换后不是,应该是不能变换成还之前的一样的字符,题目没说... {printf("NO\n");continue;}else{printf("YES\n");continue;}}if(len%2==0){for(int i=0;i<len/2;i++)a[i]=s[i];int k=0;for(int i=len-1;i>=len/2;i--)b[k++]=s[i];int n=0;for(int i=0;i<len/2;i++)if(a[i]!=b[i])n++;if(n==1)           //aaaa、aaaaaa变换后也不是    printf("YES\n");elseprintf("NO\n");      }else{for(int i=0;i<len/2;i++)a[i]=s[i];int k=0;for(int i=len-1;i>len/2;i--)b[k++]=s[i];int n=0;for(int i=0;i<k;i++)if(a[i]!=b[i])n++;if(n<=1)         //aabaa变换后是回文串,可以变换字符b printf("YES\n");elseprintf("NO\n");}}return 0;}
下面是简洁点的代码:
#include<cstdio>#include<cstring>int main(){int len;char s[20];while(scanf("%s",s)!=EOF){len=strlen(s);int ans=0;for(int i=0;i<len;i++){if(s[i]!=s[len-i-1])ans++;}if(ans==2||(ans==0&&len%2!=0))    printf("YES\n");elseprintf("NO\n");    }return 0;} 



原创粉丝点击