有效回文串
问题描述
给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。
思路
这道题思路还是比较简单的,我是用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继续操作。