回文串&镜像串
字符对应关系
A 3 HIL JM O 2TUVWXY51SE Z 8 (镜像字符) ABCDEFGHIGKLMNOPQRSTUVWXYZ123456789(原字符) 镜像字符为空的地方,说明对应的原字符没有镜像字符
样例输入:
NOTAPALINDROME
LSAPALINILAPASI
样例输出:
NOTAPALINDROME — is not a palindrome.
LSAPALINILAPASI — is not a palindrome.
镜像字符:
const char* rev = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
返回镜像字符:
char r(char ch) { if(isalpha(ch)) return rev[ch - 'A']; return rev[ch - '0' + 25]; }
isalpha(int c)当c为英文字母a-z或A-Z时,返回非零值,否则返回零。相当于
if(c<='z' && c>='a' || c<='Z' && c>='A')
rev[‘A’-‘A’]值为’A’
rev[‘B’-‘A’]值为’ ‘
rev[‘8’-‘0’+25]值为’8’
主函数:
int main() { char s[30]; while(scanf("%s", s) == 1) { int len = strlen(s); int p = 1, m = 1; //状态,是回文串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-1-i]) m = 0; // 不是镜像串 } printf("%s -- is %s.\n\n", s, msg[m*2+p]); /* *既不是回文串p=0,也不是镜像串m=0,m*2+p=0; *是回文串p=1,但不是镜像串m=0.m*2+p=1; *不是回文串p=0,但是镜像串m=1,m*2+p=2; *既是回文串p=1,又是镜像串m=1,m*2+p=3 */ } return 0; }
结果:
const char* msg[] = {"not a palindrome", "a regular palindrome", "a mirrored string", "a mirrored palindrome"};