目录

附JSPythonC题解-Leetcode面试150题-5

[附JS、Python、C++题解] Leetcode面试150题 (5)

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 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; 
}