「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」。
前言
大家好,我是程序猿小白 gw_Gw,很高兴能和大家一起学习进步。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文主要介绍Leetcode的验证回文串的分析以及解法。
题目
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true 解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car" 输出: false 解释:"raceacar" 不是回文串
提示:
1 <= s.length <= 2 * 105 字符串 s 由 ASCII 字符组成 相关标签 双指针 字符串
作者:力扣 (LeetCode) 链接:leetcode-cn.com/leetbook/re…
解法1
首先来看一个最简单的解法,先对给定的字符串进行处理,把除了字母和数字之外的字符全部替换掉,这里我们使用正则表达式最为简单。
- 构造正则表达式
- 将字符串转化为StringBuffer类型。
- 调用reverse()方法将两个字符串进行比较。
- 返回结果
【代码实现】
public static boolean isPalindrome1(String s){
/*
解法1:使用正则表达式
*/
s=s.replaceAll("[^A-Za-z0-9]","").toLowerCase();
String s1 = new StringBuffer(s).reverse().toString();
return s.equals(s1);
}
解法2
这道题可以说是双指针的典型代表了,我们也可以使用双指针来解这道题。
思路:
- 设置双指针,分别指向字符串的头的尾。
- 移动双指针依次进行比较,一个向前移,一个向后移。
- 返回结果
【代码实现】
public static boolean isPalindrome(String s) {
/*
解法1:双指针
*/
//如果是空串直接返回true
if("".equals(s)){
return true;
}
//先把所有字母转化为小写字母
s=s.toLowerCase();
int j=s.length()-1;
for (int i = 0; i < j; i++,j--) {
while(i<s.length()&&!((s.charAt(i)>='a' && s.charAt(i)<='z') ||(s.charAt(i)>='0'&&s.charAt(i)<='9'))){
i++;
}
while(j>=0&&!((s.charAt(j)>='a' && s.charAt(j)<='z') ||(s.charAt(j)>='0'&&s.charAt(j)<='9'))){
j--;
}
if(i<s.length()&&j>=0 &&s.charAt(i)!=s.charAt(j)){
return false;
}
}
return true;
}
我们还可以使用Java的API对上述代码进行优化,优化如下:
public static boolean isPalindrome(String s) {
/*
解法1:双指针
*/
//如果是空串直接返回true
if("".equals(s)){
return true;
}
//先把所有字母转化为小写字母
s=s.toLowerCase();
int j=s.length()-1;
//优化,使用java自带api
for (int i = 0; i < j; i++,j--) {
while(i<j&&!Character.isLetterOrDigit(s.charAt(i))){
i++;
}
while(i<j&&!Character.isLetterOrDigit(s.charAt(j))){
j--;
}
if(s.charAt(i)!=s.charAt(j)){
return false;
}
}
return true;
}
小结
以上就是关于Leetcode验证回文串的解法思想和具体代码,通过解题不仅可以让思维更加活跃,也可以让我们更加熟悉对应语言的使用,比如第二种解法我们的优化部分,相信大家都会越来越熟练的。
希望以上内容对大家有所帮助,如有不正之处,欢迎留言指正。