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