LeetCode125
题目
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
通过次数161,730提交次数349,061
代码
方法一 倒置字符串
class Solution {
public boolean isPalindrome(String s) {
StringBuffer ans = new StringBuffer();
int length = s.length();
for(int i = 0; i < length; i++){
char a = s.charAt(i);
if(Character.isLetterOrDigit(a)){
//如果这个字符是字母或者数字则返回true(相当于去掉空格
ans.append(Character.toLowerCase(a));
//因为题意说明不在乎大小写, 那么我们就都改为小写好进行比对
}
}
StringBuffer ans_reserve = new StringBuffer (ans).reverse();
//注意,这里不能直接StringBuffer ans_reserve = new StringBuffer (ans.reverse());
//reverse()方法会直接倒置字符串本身而不是返回倒置的新对象
return ans_reserve.toString().equals(ans.toString());
//StringBuffer的equals方法直接比对时如果直接进行的话比对的是地址
//如果要比较两个字符串的值那么需要toString一下~
}
}
方法二 双指针法
StringBuffer ans = new StringBuffer();
int length = s.length();
for(int i = 0; i < length; i++){
char a = s.charAt(i);
if(Character.isLetterOrDigit(a)){
ans.append(Character.toLowerCase(a));
}
}
length = ans.length();
//长度换为ans的长度(因为原字符串可能有空格
int i = 0, j = length - 1;
//左右两个指针
while(i < j){
if(ans.charAt(i) != ans.charAt(j)){
return false;
}
i++;
j--;
//每一次循环左指针右移, 右指针左移
}
return true;