问题描述:
https://oj.leetcode.com/problems/valid-palindrome/ 点击打开链接
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.For example,
"A man, a plan, a canal: Panama" is a palindrome."race a car" is not a palindrome.
Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.For the purpose of this problem, we define empty string as valid palindrome.
问题分析:
字符串中包含有非字母符号,需要加以判别。判断回文需要知道字符串的长度。
定义:
str[1, n] :字符串str, 长度为n,,下标从1开始。is_alpha(c) : 字符c是否是字母,to_lowcase(c) : 字符c转换成小写字母。
算法:
i = 1, j = n;
while (i < j)
{
alpha1 = is_alpha(str[i]);
alpha2 = is_alpha(str[j]);
if (alpha1 && alpha2)
{
if (to_lowcase(str[i]) == to_lowcase(str[j]))
{ i++, j--;}
else
{ return false;}
}
if (!alpha1)
{ i++; }
if (!alpha2)
{ j--; }
return true;
}
C++ 代码:
class Solution {
public:
bool isPalindrome(string s)
{
int i = 0;
int j = s.length() - 1;
/* "" 空串是回文 */
while (i < j)
{
if (!is_aphanum(s[i]))
{
i++;
continue;
}
if (!is_aphanum(s[j]))
{
j--;
continue;
}
if (to_lower(s[i]) != to_lower(s[j]))
{
return false;
}
i++; j--;
}
return true;
}
bool is_aphanum(char c)
{
if (c >= 'a' && c <= 'z') return true;
if (c >= 'A' && c <= 'Z') return true;
if (c >= '0' && c <= '9') return true;
return false;
}
char to_lower(char c)
{
if (c >= 'A' && c <= 'Z') return c - 'A' + 'a';
return c;
}
};