1. 程式人生 > >演算法競賽入門經典(第二版)第三章陣列和字串中競賽題目選講例題3-3迴文詞

演算法競賽入門經典(第二版)第三章陣列和字串中競賽題目選講例題3-3迴文詞

  • 輸入一個字串,判斷它是否為迴文串以及映象串。輸入字串保證不含數字0。所謂迴文串,就是反轉以後和原串相同,如abba和madam。所有映象串,就是左右映象之後和原串相同,如2S和3AIAE。注意,並不是每個字元在映象之後都能得到一個合法字元。在本題中,每個字元的映象如圖3-3所示(空白項表示該字元映象後不能得到一個合法字元)。
    **加粗樣式
  • 既然不包含空白字元可以安全地使用scanf輸入。迴文串和映象串的判斷都不復雜,並且可以一起完成。
  • 使用常量陣列只用少量程式碼即可解決這個看上去有些複雜的題目(定義常量陣列時無須指明大小,編譯器會計算)
  • 標頭檔案ctype.h中定義的isalpha,isdigit,isprint等工具來判斷字元的屬性,而toupper,tolower等工具可以用來轉換大小寫。如果ch是大寫字母則ch-'A’就是它在字母表中的序號;類似地如果ch是數字則ch-'0’就是這個數字的本身
#include <stdio.h>
#include <string.h>
#include <ctype.h>
const char *rev="A   3  HIL JM O   2TUVWXY51SE Z  8 ";//定義常量陣列不用考慮記憶體
const char *msg[]={"不是映象串也不是迴文串","是迴文串但不是映象串","是映象串但不是迴文串","既是迴文串也是映象串"};
char r(char ch)//引數是字元返回值是ch的映象字元這是因為該常量陣列中
               //前26項各是大寫字母的映象而後10個是數字的映象所以需判斷是否為字母或者數字
{ if(isalpha(ch)) return rev[ch-'A']; return rev[ch-'0'+25]; } int main() { char s[30]; while(scanf("%s",s)==1) { int len=strlen(s); int p=1,m=1; for(int i=0;i<(len+1)/2;i++) { if(s[i]!=s[len-1-i]) p=0; if(r(s[i]!=s[len-i-1])) m=0; } printf
("%s--is %s.\n\n",s,msg[m*2+p]);//巧妙的運用減少了大量的時間 } return 0; }