💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
>[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; } } ~~~