第八周_A-leetCode-字符串-验证回文串

53 阅读1分钟

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');
    }
}