题干:
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.
备注:面试者可以会问这样的问题:
问:空字符串算是回文字符串吗?
答:在这个问题里,我们将空字符串运定义为回文字符串。
分析:
palindrome ['pælɪndrəʊm] n.回文(即正读反读都一样的词或短语)
step1:定义两个“指针”i,j——一个为“头指针”,另一个是“尾指针”。
step2:两“指针”相向移动,跳过既非字母也非数字的字符,判断指针位置的字符是否相等。
不相等,返回false。相等继续移动,直到 i>=j ,返回ture。
跳过既非字母也非数字的字符,用到了 Character.isLetterOrDigit() 方法。
不区分大小写,所以都转化为小写来判断是否相等,用到了 Character.toLowerCase() 方法。
Solution:
1 class Solution { 2 public boolean isPalindrome(String s) { 3 int i = 0, j = s.length() - 1; 4 while (i < j) { 5 while (i < j && !Character.isLetterOrDigit(s.charAt(i))) 6 i++; 7 while (i < j && !Character.isLetterOrDigit(s.charAt(j))) 8 j--; 9 if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j))) { 10 return false; 11 } 12 i++; 13 j--; 14 } 15 return true; 16 } 17 }