原题网址:https://www.lintcode.com/problem/valid-palindrome/description
描述
给定一个字符串,判断其是否为一个回文串。只考虑字母和数字,忽略大小写。
你是否考虑过,字符串有可能是空字符串?这是面试过程中,面试官常常会问的问题。
在这个题目中,我们将空字符串判定为有效回文。
您在真实的面试中是否遇到过这个题?
样例
"A man, a plan, a canal: Panama"
是一个回文。
"race a car"
不是一个回文。
挑战
O(n) 时间复杂度,且不占用额外空间。
标签
字符串处理
两根指针
思路:设置两根指针,一个从头开始遍历,另一个从尾开始遍历。如果不是字母或者数字,跳过判断下一个。如果是,判断是否相同(注意大小写字母的判断),不相同return false。
AC代码:
class Solution {
public:
/**
* @param s: A string
* @return: Whether the string is a valid palindrome
*/
bool isPalindrome(string &s) {
// write your code here
int n=s.size();
if (n==0)
{
return true;
}
int i=0,j=n-1;
while(i<=j)
{
if (tmp(s[i])&&tmp(s[j]))
{
if (!isSame(s[i],s[j]))
{
return false;
}
}
if (!tmp(s[i]))
{
i++;
continue;
}
if (!tmp(s[j]))
{
j--;
continue;
}
i++;
j--;
}
return true;
}
bool tmp(char c)
{
if ((c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c>='0'&&c<='9'))
{
return true;
}
return false;
}
bool isSame(char c1,char c2)
{
if (c1==c2)
{
return true;
}
if (abs(c1-c2)==abs('a'-'A'))
{
return true;
}
return false;
}
};
其他代码:
https://blog.csdn.net/ljlstart/article/details/48183745 判断两个字符是否相同时,还可以将两个字符串都转换成小写(或大写)再判断,这样就不用定义额外的判断相等函数了。
可参考: