1 题目
题目:有效回文串(Valid Palindrome)
描述:给定一个字符串,判断其是否为一个回文串。只考虑字母和数字,忽略大小写。
lintcode题号——415,难度——medium
样例1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释: "amanaplanacanalpanama"
样例2:
输入: "race a car"
输出: false
解释: "raceacar"
2 解决方案
2.1 思路
使用两个指针,分别从头尾对向而行,逐个字符判断是否相同即可,注意题中要求跳过非字母和数字的字符,忽略大小写可以通过将字符都转成小写再比较。
2.2 时间复杂度
时间复杂度为O(n)。
2.3 空间复杂度
空间复杂度为O(1)。
3 源码
细节:
- 使用对向双指针法判断回文串。
- 判断条件为left < right即可,不需要判断left == right的情况。
- 判断字母和数字可以使用isalnum()函数,字符转小写可以使用tolower()函数。
C++版本:
/**
* @param s: A string
* @return: Whether the string is a valid palindrome
*/
bool isPalindrome(string &s) {
// write your code here
if (s.empty())
{
return true;
}
int left = 0;
int right = s.size() - 1;
while (left < right)
{
if (!isalnum(s.at(left)))
{
left++;
continue; // 跳过非字母和数字的字符
}
//while (left < right && !isalnum(s.at(left))) // 也可以使用while跳过字符
//{
// left++;
//}
if (!isalnum(s.at(right)))
{
right--;
continue; // 跳过非字母和数字的字符
}
//while (left < right && !isalnum(s.at(right))) // 也可以使用while跳过字符
//{
// right--;
//}
if (tolower(s.at(left)) != tolower(s.at(right))) // 都转成小写进行比较
{
return false;
}
left++;
right--;
}
return true;
}