LeetCode 字符串简单-验证回文串:思路都写在注释上面了
package com.practice.字符串;
/**
* 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
*
* 字母和数字都属于字母数字字符。
*
* 给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
*/
public class 验证回文串 {
public static void main(String[] args) {
System.out.println(isPalindrome("race a car"));
}
/**
* leetCode 参考写法:Character.isLetterOrDigit(char ch) 方法
*/
public static boolean isPalindromeLeetCode(String s) {
StringBuilder stringBuilder=new StringBuilder();
int length=s.length();
for (int i = 0; i < length; i++) {
char ch =s.charAt(i);
if(Character.isLetterOrDigit(ch)){ // Character 方法判断只能是否为 字母或数字
stringBuilder.append(Character.toLowerCase(ch));
}
}
// 反转一次
StringBuffer sgood_rev = new StringBuffer(stringBuilder).reverse();
// 直接比较两个是否相等
return stringBuilder.toString().equals(sgood_rev.toString());
}
/**
* (判断使用 char 在 a-z / 0-9 之间)
* 双指针写法:左右指针不断移动比较
*/
public static boolean isPalindrome(String s){
char[] c = s.toLowerCase().toCharArray();
int left=0;
int right=c.length-1;
while(left<right){
while(!isValidChar(c[left])&&left<right){
left++;
}
while(!isValidChar(c[right])&&left<right){
right--;
}
if(c[left]!=c[right]){
return false;
}
left++;
right--;
}
return true;
}
public static boolean isValidChar(char ch){
return (ch>='a'&&ch<='z') || (ch>='0'&&ch<='9');
}
}