原题
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:
1. 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.
题目分析
判断一个字符串是不是回文
字符串。
首、尾指针分别指向有效字符或数字,一一比较,若过程中出现不等,直接返回false,若两个指针碰头了,表示字符首、尾都相等,返回true。
代码实现
public class Solution
{
public bool IsPalindrome(string s)
{
int i, j;
if (s == string.Empty) return true;
for (i = 0, j = s.Length - 1; i < s.Length && j > 0; i++, j--)
{
while (i < s.Length && !isAlphanumeric(s[i]))
i++;
while (i < j && !isAlphanumeric(s[j]))
j--;
if (i >= j) //碰头表示成功!
break;
if (!isEqual(s[i], s[j]))
return false;
}
return true;
}
判断一个字符是不是数字或字母:
private bool isAlphanumeric(char c)
{
return char.IsLetter(c) || char.IsDigit(c);
}
判断字符是否相等,忽略大小写:
private bool isEqual(char c1, char c2)
{
//要做字符和字母的区别对待,数字和字母字符一定不相等。
if (char.IsDigit(c1) && char.IsLetter(c2))
return false;
if (char.IsDigit(c2) && char.IsLetter(c1))
return false;
//如果不考虑以上,请参考数字0和字符P的取值。
if (c1 == c2) return true;
int c1int = Convert.ToInt32(c1);
int c2int = Convert.ToInt32(c2);
return Math.Abs(c1int - c2int) == 32;
}