LeetCode之验证回文串
125. 验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
题目解析
先理解一个概念:所谓回文,就是一个正读和反读都一样的字符串。
先假设是验证一个单词level
是否是回文字符串,通过概念涉及到正
与反
,那么很容易想到使用双指针,从字符的开头和结尾处开始遍历整个字符串,相同则继续向前寻找,不同则直接返回false
。
而这里与单独验证一个单词是否是回文字符串有所区别的是加入了空格
与非字母数字
的字符,但实际上的做法一样的:
一开始先建立两个指针,left
和right
,让它们分别从字符的开头和结尾处开始遍历整个字符串。
如果遇到非字母数字的字符就跳过,继续往下找,直到找到下一个字母数字或者结束遍历,如果遇到大写字母,就将其转为小写。
当左右指针都找到字母数字时,可以进行比较的时候,比较这两个字符,如果相等,则两个指针向它们的前进方向挪动,然后继续比较下面两个分别找到的字母数字,若不相等,直接返回false
。
代码实现
public static void main(String[] args) {
System.out.println(isPalindrome("A man, a plan, a canal: Panama"));
}
public static boolean isPalindrome(String s) {
if (s.length() == 0) {
return true;
}
int r = 0, l = s.length() - 1;
while (r < l) {
if (!Character.isLetterOrDigit(s.charAt(r))) {
r++;
} else if (!Character.isLetterOrDigit(s.charAt(l))) {
l--;
} else {
if (Character.toLowerCase(s.charAt(r)) == Character.toLowerCase(s.charAt(l))) {
r++;
l--;
} else {
return false;
}
}
}
return true;
}
// ASCII码
// 0-9 48-57
// A-Z 65-90
// a-z 97-122
public boolean isPalindrome(String s) {
int low = 0;
int high = s.length() - 1;
for (; ; ) {
if (low >= high) {
return true;
}
int start = (int) s.charAt(low);
// 如果是大写字母,转成小写字母
if (start >= 65 && start <= 90) {
start += 32;
}
// 如果是小写字母或者是数字
if ((start >= 97 && start <= 122) || (start >= 48 && start <= 57)) {
int end = (int) s.charAt(high);
if (end >= 65 && end <= 90) {
end += 32;
}
if ((end >= 97 && end <= 122) || (end >= 48 && end <= 57)) {
if (start != end) {
return false;
} else {
low++;
high--;
}
} else {
high--;
}
} else {
low++;
}
}
}