uva 401 Palindromes(字符串回文处理)

来源:互联网 发布:陈有西 公知律师 编辑:程序博客网 时间:2024/05/24 15:42

题意是给你一个字符串,你来判断它是题目给你的哪种字符串。


挫逼死了,开始的时候定了一个标致,从标致向两边递推来判断字符串是否相等。

结果把 len / 2 判断错了:若 len 为奇数(比如 5 ),则 len / 2 = 2,则中心点为  s[ 2 ],即s[ len / 2],向两边推。

                                             若 len 为偶数(比如 6 ),则 len / 2 = 3,则对称点为  s[ 3 ],即s[len / 2],与s[len / 2 + 1] 对称,然后向两边推。

后来我发现这种做法真心挫爆了。


比较范例的做法:

用 len / 2 来限制左边移动的指针长度,用len - i - 1 来和 i ,对称。

bool is_regular(){    int len = strlen(s);    for (int i = 0; i < len / 2; i++)    {        if (s[i] != s[len - i - 1])            return false;    }    return true;}
这是本题的第一个注意点。

第二个注意点是第二种判断时,若只有一个字符,需要判断这个字符是否在镜子字符里,在的话是镜子回文,不在是一般回文。

第二种判断实现的时候,基本思路是,一个遍历找到镜子字符,然后再判断。开始的时候逻辑搞错了,所以一直错。


代码:

#include<stdio.h>#include<string.h>char s[10000];bool is_regular(){    int len = strlen(s);    for (int i = 0; i < len / 2; i++)    {        if (s[i] != s[len - i - 1])            return false;    }    return true;}bool is_mirrored(){    char m1[] = {"AEHIJLMOSTUVWXYZ12358"};    char m2[] = {"A3HILJMO2TUVWXY51SEZ8"};    int len = strlen(s);    int i;    if (len == 1)    {        for (i = 0; i < 21; i++)        {            if (s[0] == m1[i])                break;        }        if (i == 21 || s[0] != m2[i])            return false;    }    else    {        int j;        for(j = 0; j < len / 2; j++)        {            for (i = 0; i < 21; i++)            {                if (s[j] == m1[i])                    break;            }            if (i == 21 || s[len - j - 1] != m2[i])                return false;        }    }    return true;}int main(){    while (scanf("%s", s) != EOF)    {        if (is_regular())        {            if (is_mirrored())            {                printf("%s -- is a mirrored palindrome.\n\n", s);            }            else            {                printf("%s -- is a regular palindrome.\n\n", s);            }        }        else        {            if (is_mirrored())                printf("%s -- is a mirrored string.\n\n", s);            else                printf("%s -- is not a palindrome.\n\n", s);        }    }    return 0;}


0 0
原创粉丝点击