题目描述:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
这个问题和回文数的那个问题特别相似,不过这个不能用回文数的那种方法,想看回文数怎么实现的,看我的这一片博客:
https://blog.csdn.net/weixin_37850160/article/details/86525337
这道题有两种思路:
第一种就是用内置函数,revese这个字符串反转方法,然后和反转之前的原字符串进行比较,相同就是回文串,不相同则不是(这两种思路首先都得进行预处理,将特殊字符去掉,可以用正则表达式,也可以用字符串的替换方法,第一个参数是模式匹配参数,匹配到时替换掉特殊字符就行。) (这种方式不推荐使用,因为没有用到过多的算法)
第二种方法:就是用对撞指针,和昨晚的那个《两数之和输入有序数组》那道题特别像,就是一个是int,一个是string。定义两个指针,然后一个指向首位,一个指向末尾,(必须先进行预处理),判断是否相等,若相等,就让两个指针一个向前,一个向后,在进行判断,如果不相等则输出flase(不是回文串),最后在for外输出true(是回文串),因为若for执行完不返回flase,则证明字符串是回文串。
public static void main(String[] args){
String str= "A man, a plan, a canal: Panama";
// 模式匹配的字符串(也可以用[^a-zA-Z0-9]除了这些之外的字符,推荐这个,简洁)
String regEx="[\n`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。, 、?]";
// 正则表达式匹配(匹配模式)
// Pattern par =Pattern.compile (regEx);
//// 要匹配的字符串
// Matcher m = par.matcher ( str );
//// 用空字符串代替匹配到的特殊字符,去掉首末的空格
// String str2 = m.replaceAll ( "" ).trim ().toLowerCase ();
String str2 = str.replaceAll ( regEx,"" ).toLowerCase ();
System.out.println(str2);
int j = str2.length ()-1;
for(int i = 0;i<str2.length ();){
if (str2.charAt ( i )==str2.charAt ( j)){
i++;
j--;
}else {
System.out.println("不是回文串");
break;
}
}
System.out.println("是回文串");
}
执行结果:
执行用时:
总结:这道题和上一道题都是对撞指针法,这种放法对数组进行操作十分遍历和有效。是一个非常不错的方法。
2019-3-7