推荐答案
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")); // false5. 复杂度分析
- 时间复杂度: O(n),其中 n 是字符串的长度。清理字符串和反转字符串都需要 O(n) 的时间。
- 空间复杂度: O(n),因为我们需要额外的空间来存储清理后的字符串和反转后的字符串。