演算法競賽入門經典(第二版)第三章陣列和字串中競賽題目選講例題3-3迴文詞
阿新 • • 發佈:2018-11-04
- 輸入一個字串,判斷它是否為迴文串以及映象串。輸入字串保證不含數字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;
}