描述
判断一个由字母、数字和空格组成的字符串是否是回文。
约束:
空字符串为回文;
示例:
”A man, a plan, a canal: Panama”是回文
”race a car” 非回文。
分析
采用两端遍历的方法,分别从左向右,从右向左进行遍历。
1)左索引为非字母、非数字则向右移动一个位置;
2)右索引为非字母、非数字则向左移动一个位置;
3)左右索引的值不相等,判断为非回文;
4)左索引大于等于右索引则字符串为回文,结束循环;
实现
bool isPalindrome(string s)
{
transform(s.begin(), s.end(), s.begin(), ::tolower);
auto left = s.begin();
auto right = prev(s.end());
while (left < right) {
if (!::isalnum(*left)) {
++left;
}
else if (!::isalnum(*right)) {
--right;
}
else if(*left != *right) {
return false;
}
++left;
--right;
}
return true;
}
时间复杂度为O(n),空间复杂度为O(1)。
网友评论