给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
来源:https://leetcode-cn.com/problems/valid-palindrome/
方法一:利用双指针进行比较判断
public class HuiWenChuan {
public static void main(String[] args) {
String string = "race a car";
HuiWenChuan test = new HuiWenChuan();
test.isPlidString2(string);//判断是否为回文字符串
}
/**
* 利用双指针,从而进行比较
* @param s
*/
public void isPlidString2(String s){
StringBuilder sb = new StringBuilder();
//遍历字符串,将字母或者数字字符添加到这个StringBuilder对象中
for(int i = 0; i < s.length(); i++){
Character ch = s.charAt(i);
if(Character.isLetterOrDigit(ch)){
/**
*调用Character中的静态方法isLetterOrDigit,从而判断是否为
*数字或者字母字符,如果直接添加ch的话,那么就会导致下面进行
*比较的时候,要调用equalsIgnoreCase
*sb.append(""+ch);
*/
sb.append(Character.toLowerCase(ch));//将对应的字符转成小写之后,添加到StringBuilder 对象中
}
}
//利用双指针,通过左右指针进行比较
int left = 0;
int right = sb.length() - 1;
while(left < right){
//通过比较前后两个字符是否相同
if(sb.charAt(left) != sb.charAt(right)){
System.out.println("不是回文串");
return;
}
left++;
right--;
}
System.out.println("是回文串");
}
}
方法二:通过StringBuilder的reverse方法进行实现
1、由于只考虑字母和数字字符,因此遍历字符串,然后获取对应得字符,通过调用Character类中的静态方法isLetterOrDigit方法,从而判断当前的字符是否为数字或者字母,如果是,就将这个字符转成小写之后添加到StringBuilder中,之所以要转成小写,是因为题目得要求是忽略字母得大小写,因此此时将字母转成小写转换之后,之后直接调用equals方法进行比较,而不是调用equalsIgnoreCase方法进行比较
2、当将字符串中题目要求的字符拼接之后,StringBuilder对象调用toString方法,从而获取相应的字符串targer
3、StringBuilder对象调用reverse方法,之后再调用toString方法,从而返回target字符串的倒序
4、通过调用equals方法,如果返回true,说明是一个回文字符,否则不是。
值得注意的是,这里的2、3步骤是不可以调换的。
给出的字符串是"race a car",判断是否为回文串,如果调换之后,就会发生这样的结果:
可以发现,调换之后,StringBuilder对象sb先执行reverse()方法,从而使得sb对应的字符串倒序。
代码实现:
public class HuiWenChuan {
public static void main(String[] args) {
String string = "race a car";
HuiWenChuan test = new HuiWenChuan();
test.isPlidString(string);//判断是否为回文字符串
}
/**
* 通过调用StringBuilder中的reverse方法,从而获取倒序,然后
* 进行比较,判断是否相同
* @param s
*/
public void isPlidString(String s) {
StringBuilder sb = new StringBuilder();
//遍历字符串,将字母或者数字字符添加到这个StringBuilder对象中
for(int i = 0; i < s.length(); i++){
Character ch = s.charAt(i);
if(Character.isLetterOrDigit(ch)){
/**
*调用Character中的静态方法isLetterOrDigit,从而判断是否
*为数字或者字母字符如果直接添加ch的话,那么就会导致下面进
*行比较的时候,要调用equalsIgnoreCase
*sb.append(""+ch);
*/
sb.append(Character.toLowerCase(ch));//将对应的字符转成小写之后,添加到StringBuilder对象中
}
}
//调用相关的方法,从而将获取到sb对象的倒序字符串
String target = sb.toString();
/**
*注意这一步先,否则如果和下面一步交换,那么就会改变原来的sb对应的字符串,即sb.toString()方法写在sb.reverse().toString()之前,否则,两者的顺序调换的时候,此时通过debug发现,调用sb.toString之后,得到的是倒序的字符,而不再是原来的字符串target
*/
String reverseString = sb.reverse().toString();
/*
if(target.equalsIgnoreCase(reverseString))
System.out.println("是回文串");
else
System.out.println("不是回文串");
*/
if(target.equals(reverseString))
System.out.println("是回文串");
else
System.out.println("不是回文串");
}
}