推荐答案
function isPalindrome(str) { // 移除所有非字母数字字符并转换为小写 const cleanedStr = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase(); // 比较字符串与反转后的字符串 return cleanedStr === cleanedStr.split('').reverse().join(''); }
本题详细解读
1. 问题分析
回文字符串是指正读和反读都相同的字符串。例如,"A man, a plan, a canal: Panama" 是一个回文字符串,因为忽略非字母数字字符后,正读和反读都是相同的。
2. 解决方案
- 步骤1: 首先,我们需要清理字符串,移除所有非字母数字字符,并将字符串转换为小写。这可以通过正则表达式
/[^a-zA-Z0-9]/g
来实现,replace
方法用于移除这些字符。 - 步骤2: 然后,我们将清理后的字符串反转,并与原字符串进行比较。如果两者相同,则说明该字符串是回文字符串。
3. 代码实现
- 清理字符串: 使用
replace
方法和正则表达式/[^a-zA-Z0-9]/g
移除所有非字母数字字符,并使用toLowerCase()
方法将字符串转换为小写。 - 反转字符串: 使用
split('')
将字符串转换为数组,然后使用reverse()
方法反转数组,最后使用join('')
将数组转换回字符串。 - 比较字符串: 比较清理后的字符串与反转后的字符串是否相同。
4. 示例
console.log(isPalindrome("A man, a plan, a canal: Panama")); // true console.log(isPalindrome("race a car")); // false
5. 复杂度分析
- 时间复杂度: O(n),其中 n 是字符串的长度。清理字符串和反转字符串都需要 O(n) 的时间。
- 空间复杂度: O(n),因为我们需要额外的空间来存储清理后的字符串和反转后的字符串。