package day06;
//给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
//说明:本题中,我们将空字符串定义为有效的回文串。
public class Palindrome {
public static void main(String[] args) {
String s = "race a car";//true
//测试思路1
//boolean res = isPalindrome(s);
//测试思路2
boolean res = isPalindrome02(s);
System.out.println(res);
}
//思路1:双指针法,从两边向中间判断,跳过非字母和数字字符
public static boolean isPalindrome(String s) {
//空字符串定义为有效的回文串
if(s == null || s.length() == 0) {
return true;
}
int i = 0;
int j = s.length() - 1;
while (i < j) {
//跳过非字母和数字字符,不比较
while (i < j && !Character.isDigit(s.charAt(i)) && !Character.isLetter(s.charAt(i)) ) {
i ++;
}
while ( i < j && !Character.isDigit(s.charAt(j)) && !Character.isLetter(s.charAt(j))) {
j --;
}
//只考虑字母和数字字符,可以忽略字母的大小写
if(i < j && !s.substring(i,i+1).equalsIgnoreCase(s.substring(j,j+1))) {
return false;
}
i ++;
j --;
}
return true;
}
//思路2:去掉字符串s 的所有非数字和字母,放到另一个字符串rev中,如果是回文串,则反转过后和反转之前一定相等
public static boolean isPalindrome02(String s) {
if (s == null || s.length() == 0) {
return true;
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < s.length(); i ++) {
char ch = s.charAt(i);
if(Character.isDigit(ch) || Character.isLetter(ch)) {
sb.append(Character.toLowerCase(ch));//全部转小写
}
}
StringBuilder rev = new StringBuilder(sb).reverse();
return sb.toString().equals(rev.toString());
}
}
验证回文串
最新推荐文章于 2021-11-22 14:27:53 发布