回文判断

来源:互联网 发布:手机查看淘宝图片空间 编辑:程序博客网 时间:2024/05/11 14:17

问题

回文,英文palindrome,指一个顺着读和反过来读都一样的字符串,比如madam、我爱我,这样的短句在智力性、趣味性和艺术性上都颇有特色,中国历史上还有很多有趣的回文诗。那么如何判断一个字串是否是回文?

思路1

既然回文字符串有正过来和反过来读都一样的特性,那么我们可以考虑将字符串翻转,然后再与原字符串相比较,这种思路是最显而易见的。这种思路的时间复杂度和空间复杂度都为O(n):

void Reverse(char *str, int from, int to){    if(NULL == str)        return ;    while(from < to){        char temp = str[from];        str[from++] = str[to];        str[to--] = temp;    }}bool IsPalindrome(char *str){    char *p = new char[strlen(str)];    strcpy(p, str);    Reverse(str, 0, strlen(str)-1);    int begin = 0;    while(begin < strlen(str)){        if(p[begin] != str[begin])            return false;        ++begin;    }    return true;}

思路2

虽然思路1很好的解决了这个问题,但是我们有没有更好的方法呢?当然有,可以之间比较第一个字符和最后一个字符,第二个字符与倒数第二个字符……,这种方法的空间复杂度可以减小到O(1).

bool IsPalindrome(char *str){    if(NULL == str)        return false;    int begin = 0;    int end = strlen(str)-1;    while(begin < end){        if(str[begin++] != str[end--]){            return false;        }    }    return true;}

思路3

思路3其实就是思路2的逆过程,从中间往两边比,时间复杂度和空间复杂度跟2是一样的。

bool IsPalindrome(char* str, int n){    if(NULL == str || n < 1)        return false;    char *first, *second;    int m = n/2 - 1;    first = str + m;    second = str + n - m - 1;    while(first >= str){        if(*(first--) != *(second++))            return false;     }    return true;} 
0 0
原创粉丝点击