>[success] # Leetcode -- 125. 验证回文串
* **描述**
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
* **说明**:
本题中,我们将空字符串定义为有效的回文串。
* **示例 1**:
~~~
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
~~~
* **示例 2**:
~~~
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
~~~
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
>[info] ## 常规解法
* 使用 js 先将字符中的非数字字母通过 **replace**进行替换,在使用反转字符串方法进行比较字符
>[info] ## 使用对撞指针思路
* 创建两个指针,依次比较其中如果当前指针所指的值非数字或者字母则跳过(题中强调只对数字字母比较可看实例一),如果是字母则比较当前指针前后所在位置值是否相等
![](https://img.kancloud.cn/28/a0/28a0458e79f8a5c3704a18e52e342c21_1461x1318.png)
>[danger] ##### js
~~~
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
const re = /[0-9a-zA-Z]/
let left = 0
let right = s.length -1
while( left < right ){
// 如果left 指针的值为非字母数字自动后移动
// 前移动最大值不能超过当前字符串
while(left < s.length && !re.test(s.charAt(left))) left ++
// 如果right 指针的值为字母数字自动前移动
// 后移动最小值不能小于 0
while(right > 0 && !re.test(s.charAt(right))) right --
// 当指针从头到尾发现所有字符都不是字母数字时候
if(left === s.length && right === 0) return true
// 对撞指针 如果值相等互相前进 和 后退
if(s.charAt(left).toLowerCase() === s.charAt(right).toLocaleLowerCase()){
left ++
right --
}else{
return false
}
}
return true
};
~~~
>[danger] ##### java
* Character.isLetterOrDigit 判读是否是数字和字母
~~~
class Solution {
public boolean isPalindrome(String s) {
int left = 0;
int right = s.length() - 1;
while(left < right){
while(left < right && !Character.isLetterOrDigit(s.charAt(left))) left++;
while(left < right && !Character.isLetterOrDigit(s.charAt(right))) right--;
if(left < right){
if (Character.toLowerCase(s.charAt(left)) !=
Character.toLowerCase(s.charAt(right))) {
return false;
}
left++;
right--;
}
}
return true;
}
}
~~~
- 刷题准备
- 统计数组中元素出现次数
- Leetcode -- 442数组中重复的数据
- leetcode -- 448 找到所有数组中消失的数字
- 字符类似题
- Leetcode -- 1002 查找共用字符
- Leetcode -- 1370上升下降字符串
- 指针类题解
- Leetcode -- 283 移动零
- Leetcode -- 26. 删除有序数组中的重复项
- Leetcode -- 80. 删除有序数组中的重复项 II
- Leetcode -- 27. 移除元素
- Leetcode -- 344. 反转字符串
- Leetcode -- 125 验证回文串
- Leetcode -- 11 盛最多水的容器
- Leetcode -- 1480. 一维数组的动态和