>[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] ## 使用對撞指針思路
* 創建兩個指針,依次比較其中如果當前指針所指的值非數字或者字母則跳過(題中強調只對數字字母比較可看實例一),如果是字母則比較當前指針前后所在位置值是否相等

>[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. 一維數組的動態和