题目
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
示例 :
输入: “A man, a plan, a canal: Panama”
输出: true
输入: “race a car”
输出: false
说明: 本题中,我们将空字符串定义为有效的回文串。
标签
字符串;双指针;正则表达式
解题思路
方法一:双指针
在首尾分别设定一个指针,用于指向字母/数字等符合条件的字符,将大写字母变为小写字母以便于比较。
方法二:正则表达式
使用正则表达式对原字符串进行处理,留下符合条件的字符串样式,然后对该字符串进行回文比较。
代码
public class Leetcode125_ValidPalindrome {
public static void main(String[] args) {
String s = "A man, a plan, a canal: Panama";
System.out.println(Leetcode125_ValidPalindrome.isPalindrome2(s));
}
//方法一:双指针
public static boolean isPalindrome(String s) {
if (s.equals("")) {
return true;
}
int len = s.length();
for (int i = 0, j = len - 1; i < j; ) {
if (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z' || s.charAt(i) >= 'a' && s.charAt(i) <= 'z' || s.charAt(i) >= '0' && s.charAt(i) <= '9') {
if (s.charAt(j) >= 'A' && s.charAt(j) <= 'Z' || s.charAt(j) >= 'a' && s.charAt(j) <= 'z' || s.charAt(j) >= '0' && s.charAt(j) <= '9') {
//关键部分
if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j))) {
return false;
}
i++;
j--;
} else {
//i符合,j不符合
j--;
}
} else {
//i不符合
i++;
}
}
return true;
}
//方法二:正则表达式
public static boolean isPalindrome2(String s) {
//正则表达式,^代表非
String str = s.replaceAll("[^a-zA-Z0-9]", "");
System.out.println(str);
int len = str.length();
for (int i = 0; i < len/2; i++) {
char ch = str.charAt(i);
if (Character.toLowerCase(ch) != Character.toLowerCase(str.charAt(len - 1 - i))) {
return false;
}
}
return true;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome/