回文词(Uva 401)

来源:互联网 发布:数据线线芯 编辑:程序博客网 时间:2024/06/07 05:14

输入一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字0。所谓回文串,就是反转以后与原串相同,如abba和madam。所谓镜像串,就是左右镜像之后和原串相同,如2S和3AIAE。注意,并不是每个字符在镜像之后都能得到一个合法字符。(空白项表示该字符镜像后不能得到一个合法字符。)

输入的每行包含一个字符串,(保证只有上述字符。不含空白字符),判断它是否为回文串和镜像串(共四种组合)。每组数据之后输出一个空行。
样例输入:
NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA
样例输出:
NOTAPALINDROME – is not a palindrome.

ISAPALINILAPASI – is a regular palindrome.

2A3MEAS – is a mirrored string.

ATOYOTA – is a mirrored palindrome.

第一版思路:回文词:新建一个数组存放原串的反转数组,两者用strcmp()比较。
镜像词:由于没有分析清楚镜像词的特点,认为仅仅只需判断字符串中的字符均存在镜像就可以了。

(没用的代码如下:)

#include <stdio.h>#include <string.h>const char mirrored[]="AEHIJLMOSTUVWXYZ12358";const int maxn=10000;const char specialChar[]="EJSZ52L3";int main(){    char str[maxn],reverse[maxn];    bool isPalindrome,isMirrored;    memset(str,0,sizeof(str));    memset(reverse,0,sizeof(reverse));    while(scanf("%s",str)==1){        isMirrored=true;        int len=strlen(str)-1;        for(int i=0;i<strlen(str);i++){            reverse[len--]=str[i];                    //复制到另一个数组中,以判断是否为回文词             if(isMirrored&&(strchr(mirrored,str[i])==NULL)) isMirrored=false;   //判断是不是镜像词,(第一步,将含有不在mirroed中的字符剔除,第二步见下面补充)        }        if(strcmp(reverse,str)==0) isPalindrome=true;        else isPalindrome=false;    ----------        if(isPalindrome&&isMirrored) printf("%s -- is a mirrored palindrome.\n\n",str);        else if(isPalindrome&&!isMirrored) printf("%s -- is a regular palindrome.\n\n",str);        else if(!isPalindrome&&isMirrored) printf("%s -- is a mirrored string.\n\n",str);        else printf("%s -- is not a palindrome.\n\n",str);    memset(str,0,sizeof(str));    memset(reverse,0,sizeof(reverse));    }    return 0;}

测试的时候,输入 2 ,结果不对。
反思:镜像词在每种意义上是“回文词”,如2AEM3AS,可以看做为:2AEMEA2。所以改进的重心放在了处理镜像不是自己本身的字符上。 在——处插入下面的代码。
(还是没用的代码:)

        int j=0;        while(isMirrored&&j<=strlen(str)/2){                for(int k=0;k<8;k++){                    if(specialChar[k]==str[j]){                        if(str[strlen(str)-1-j]!=specialChar[7-k]){//这里的strlen(str)-1不能用len代替,因为在上面的代码中len的值在改变。(这里导致了错误,用输出中间值法找到的。)                            isMirrored=false;                            break;                        }                     }                }            j++;         }

结果123ES1结果正确,但是123ESI结果不正确。
反思:没有从一开始将镜像词的特点把握。导致出错时又不想重新改变思路,加上考虑不周全,思想漏洞太多,进而继续做很多无用功。

0 0