回文判断

问题

回文,英文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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值