给定一个字符串,只考虑其中的数字和字母(忽略字母大小写)判断是否是回文串。本题认定空字符串为有效回文串,不含字母和数字的也是有效回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
方法一:
package cd.itcast;
import java.util.Scanner;
public class PalindromeStructure {
public static void main(String[] args) {
//输入字符串
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
//使用正则表达式匹配题目所要求的字母和数字(布尔值)
if (s.matches(".*[a-zA-Z0-9]+.*")) {
//从字符串提取数字和字母(该正则表达式将非字母和数字都置位“”,自然新的字符串就只有字母和数字了,可以理解为把非字母和非数字都删除了)
s = s.replaceAll("[^a-zA-Z0-9]", "");
//执行函数
boolean result = Ispalindromestructure(s, 0, s.length() - 1);
System.out.println(result);
}
//无字母和数字以及空字符串则为回文串。
else
System.out.println(true);
}
private static boolean Ispalindromestructure(String s, int i, int j) {
//使用字符串的equalsIgnoreCase功能忽略字符大小写,来判断是否一样。(数字字符不受影响)
if (s.substring(i, i + 1).equalsIgnoreCase(s.substring(j, j + 1))) {
//i和j相邻或者只相隔一个字符了,返回即可。
if (j - i <= 2) {
return true;
}
//继续递归执行本函数。
return Ispalindromestructure(s, i + 1, j - 1);
}
//不相等,返回false。
else {
return false;
}
}
}
方法二:
package cd.itcast.test;
import java.util.Objects;
import java.util.Scanner;
public class Demo01test {
public static void main(String[] args) {
//输入字符串
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
//提取字母和数字
str = str.replaceAll("[^a-zA-Z0-9]","");
//把字符串从String转换到StringBuffer形式,调用逆转方法再使用toString方法以纯字符串字面值使用equals方法判断是否相等。
System.out.println(new StringBuffer(str).reverse().toString().equals(str));
}
}
收获:使用正则表达式判断字符串是否含有字母和数字
s.matches(".*[a-zA-Z0-9]+.*")
使用正则表达式提取字母和数字
str.replaceAll("[^a-zA-Z0-9]","")
可将String对象更改为StringBuffer对象进行String所不能进行的操作,比如逆转字符串。