给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 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"));
}
}