给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
  
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
  
提示:
1 <= s.length <= 2 * 105
字符串 s 由 ASCII 字符组成
package cn.fansunion.leecode.isNumber;
/**
 * 验证回文串
 * 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
力扣
 * @author wen.lei@brgroup.com
 *
 * 2022-2-18
 */
public class ValidPalindrome {
    /* 示例 1:
     
        输入: "A man, a plan, a canal: Panama"
        输出: true
        解释:"amanaplanacanalpanama" 是回文串
        示例 2:
     
        输入: "race a car"
        输出: false
        解释:"raceacar" 不是回文串*/
    /**
     * 从字符串中找出“字母数字”的字符串,复用之前一道题的方法。换汤不换药,新瓶装旧酒。
     * @param s
     * @return
     */
    public boolean isPalindrome(String s) {
        if(s==null||s.length()==0) {
            return false;
        }
        //cn.fansunion.leecode.isNumber.PalindromeNumber.isPalindromeStr(int)
        //整数版回文数的进阶,同一个问题,稍微有点区别。相同点,都需要对输入做一点处理
        String newStr=collectLetterDigit(s);
        return isPalindromeIntByStr(newStr);
    }
     
    /**
     * 从一个字符串中找出为字母或数字的字符,返回一个新的字符串,比如:“abc--]1 23”>"abc123"
     * @param s
     * @return
     */
    private String collectLetterDigit(String s) {
        StringBuilder sb = new StringBuilder();
        for(char ch:s.toLowerCase().toCharArray()) {
            if(Character.isLetterOrDigit(ch)) {
                sb.append(ch);
            }
        }
        return sb.toString();
    }
    //根据isPalindromeIntByStr,简单处理
    public boolean isPalindromeIntByStr(String numStr) {
        //左右比较,双指针
        for (int start = 0, end = numStr.length() - 1; start < end; start++, end--) {
            if (numStr.charAt(start)!=numStr.charAt(end)) {
                return false;
            }
        }
        return true;
    }
     
    /**
     * 仅供参考用:是否为回文数:number->str 进阶:你能不将整数转为字符串来解决这个问题吗?
     * @param x
     * @return
     */
    public boolean isPalindromeIntByStr(int x) {
        if (x < 0) {
            return false;
        }
        String numStr = String.valueOf(x);
        //左右比较,双指针
        for (int start = 0, end = numStr.length() - 1; start < end; start++, end--) {
            if (numStr.charAt(start)!=numStr.charAt(end)) {
                return false;
            }
        }
        return true;
    }
}
执行结果:通过
显示详情
添加备注
执行用时:4 ms, 在所有 Java 提交中击败了42.91%的用户
内存消耗:41 MB, 在所有 Java 提交中击败了17.97%的用户
通过测试用例:480 / 480
炫耀一下:
package test.leecode.isNumber;
import org.junit.Assert;
import org.junit.Test;
import cn.fansunion.leecode.isNumber.ValidPalindrome;
/**
 * @author wen.lei@brgroup.com
 *
 * 2022-2-19
 */
public class ValidPalindromeTest {
     
    @Test
    public void test() {
        //isPalindrome
        ValidPalindrome vp = new ValidPalindrome();
        Assert.assertTrue(vp.isPalindrome("A man, a plan, a canal: Panama"));
        Assert.assertTrue(vp.isPalindrome("abcd-dc-ba"));
        Assert.assertFalse(vp.isPalindrome("race a car"));
        Assert.assertFalse(vp.isPalindrome("abcd-dc-ba1"));
    }
}