有效回文串

有效回文串

问题描述

给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。

思路

这道题思路还是比较简单的,我是用i,j两个变量指向字符串的头和尾,然后i往右走,j往左走,一旦遇到不同的,立即返回false,但是注意的一点是,如果字符串的个数是偶数个,就要在循环体中判断i的下一个是不是j,是的话,就要跳出循环,避免i和j永不相遇。

代码

bool isPalindrome(string& s) {
        // Write your code here
        string::iterator it;
        if (s.size()>1) {
            for (it = s.begin(); it != s.end();it++) {
                if ((*it<'a' || *it>'z') && (*it<'A' || *it>'Z') && (*it<'0' || *it>'9')) {
                    it=s.erase(it);
                    it--;
                }
                else if (*it >= 'a'&&*it <= 'z') {
                    *it -= 32;
                }   
                if(it==s.end())    ///222222
                    break;
            }
            int i, j;
            for (i = 0, j = s.size() - 1; i < j; i++, j--) {
                if (s[i] != s[j]) {
                    return false;
                }
                if (i + 1 == j) {
                    break;
                }
            }
        }
        return true;
    }

总结

这道题其实困扰我的是c++集合中自带的迭代器(iterator)。代码在处理Iterator的earse的时候有点问题。当一个Container执行了一次earse操作之后,原来用来遍历的iterator就失效了,其行为是不可预测的,具体情况由实现决定。同时earse操作会返回一个指向container下一个元素的iterator,如果想继续遍历,就得用返回的iterator继续操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值