题目表述
方法一:
先将字符串转换为小写字母和数字字符,然后用reverse()翻转数组进行比较
class Solution {
public boolean isPalindrome(String s) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i <s.length(); i++) {
//获取字符串中第i个字符
char ch=s.charAt(i);
//如果是字符或数字字符,则将其转换为小写并添加到sb中
if(Character.isLetterOrDigit(ch)) {
sb.append(Character.toLowerCase(ch));
}
}
//获得翻转数组
StringBuffer reverse = new StringBuffer(sb).reverse();
//返回比较结果
return sb.toString().equals(reverse.toString());
}
}
方法二:
先将字符串转换为小写字母和数字字符,然后用双指针进行逐一比较
class Solution {
public boolean isPalindrome(String s) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (Character.isLetterOrDigit(ch)) {
sb.append(Character.toLowerCase(ch));
}
}
//定义两个指针 分别指向sb的两端
int left = 0, right = s.length() - 1;
//直至两个指针相遇结束循环,否则一直进行比较
while (left < right) {
if ( sb.charAt(left) != sb.charAt(right) ) {
return false;
}
++left;
--right;
}
return true;
}
}
方法三:
原数组进行双指针操作
class Solution {
public boolean isPalindrome(String s) {
int left=0;
int right=s.length()-1;
while(left<right) {
//如果两指针还没相等并且字符串中第left个元素为非字母或数字字符时 指针继续相向移动
while(left<right&&!Character.isLetterOrDigit(s.charAt(left))) {
left++;
}
while(left<right&&!Character.isLetterOrDigit(s.charAt(right))) {
right--;
}
if(left<right) {
//如果字符串中第left个元素和第right个元素不相等时,返回false
if(Character.toLowerCase(s.charAt(left))!=Character.toLowerCase(s.charAt(right))) {
return false;
}
//两指针继续相向移动
right--;
left++;
}
}
return true;
}
}