[附JS、Python、C++题解] Leetcode面试150题 (5)
一、题目
125. 验证回文串
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
二、思路
1. 因为题目中说了正着读和反着读——想到双指针,一个从前往后,一个从后往前。
2. 将大写字符转化为小写字符,非字母字符移除——不同的语言有不同的处理方法,但是不论如何处理,这一步必须在循环遍历开始之前(因为我们要用处理后的数组进行判断)。
3. 返回的是true和false——那个对应的情况更简单就用代码判断哪个。
三、代码
① JavaScript:
function IsHuiwen(s){
let cleanS = s.toLowerCase().replace(/[^a-z0-9]/g, '');
let left = 0;
let right = cleanS.length - 1;
while (left < right){
if(cleanS[left] !== cleanS[right]){
return false;
}
left ++;
right --;
}
return true;
}
② Python:
import re
def isHW(s: str) -> bool:
cleanS = re.sub(r'[^a-z0-9]', '', s.lower())
left = 0
right = len(s) - 1
while left < right :
if cleanS[left] != cleanS[right]:
return false
left += 1
right -= 1
return true
🧐补充一点:
js代码中的 let cleanS = s.toLowerCase().replace(/[^a-z0-9]/g, '') 和python代码中的 cleanS = re.sub(r'[^a-z0-9]', '', s.lower()) 完成的都是“将大写字符转化为小写字符,非字母字符移除”这一步。具体来说:
r'[^a-z0-9]'
是一个正则表达式模式,用于匹配所有非字母数字字符。[^...]
:表示否定字符集,即匹配不在方括号内的字符。a-z
:匹配所有小写字母(a 到 z)。0-9
:匹配所有数字(0 到 9)。[^a-z0-9]
:匹配所有不是小写字母或数字的字符。
作用是:
- 将字符串
s
转换为小写。- 使用正则表达式
r'[^a-z0-9]'
匹配字符串中的所有非字母数字字符。- 将匹配到的非字母数字字符替换为空字符串
''
,即移除这些字符。g
:全局匹配标志,表示匹配字符串中的所有符合条件的部分,而不仅仅是第一个匹配。
③ C++:
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
bool isHW(const std::string& s) {
std::string cleanS;
for (char c : s) {
if (std::isalnum(c)) { // 如果是字母数字字符
cleanS += std::tolower(c); // 转换为小写并添加到结果中
}
}
int left = 0;
int right = cleanS.size() - 1;
while (left < right) {
if (cleanS[left] != cleanS[right]) {
return false;
}
left++;
right--;
}
return true;
}