返回
多维度拆解 LeetCode《初级算法》字符串之验证回文串 -- JavaScript
前端
2024-02-14 02:04:13
LeetCode《初级算法》字符串之验证回文串
LeetCode 是一个备受程序员青睐的在线算法学习平台,其《初级算法》系列包含了大量经典且具有挑战性的算法问题。本文将聚焦于其中一道字符串处理相关的题目 —— 验证回文串,并使用 JavaScript 语言提供详细的解题思路和代码实现。
1. 问题
给定一个字符串,请判断其是否为回文串。回文串是指从左到右读和从右到左读都是一样的字符串,例如 "racecar" 和 "madam" 都是回文串。
2. 解题思路
验证回文串的经典解法是利用字符串的特性,从两端向中间遍历比较字符是否相同。如果字符串的长度为奇数,则中间的字符可以忽略不计;如果字符串的长度为偶数,则中间的两个字符都需要比较。
为了提高算法的效率,我们可以将字符串转换为小写并忽略所有非字母数字的字符。这样可以减少字符串的长度,并避免不必要的比较。
3. JavaScript 代码实现
/**
* 判断一个字符串是否为回文串
*
* @param {string} str 输入的字符串
* @returns {boolean} 是否为回文串
*/
const isPalindrome = (str) => {
// 将字符串转换为小写并忽略所有非字母数字的字符
const cleanedStr = str.toLowerCase().replace(/[^a-zA-Z0-9]/g, '');
// 如果字符串为空或长度为 1,则它是回文串
if (cleanedStr === '' || cleanedStr.length === 1) {
return true;
}
// 从两端向中间遍历比较字符
for (let i = 0, j = cleanedStr.length - 1; i < j; i++, j--) {
if (cleanedStr[i] !== cleanedStr[j]) {
return false;
}
}
// 如果遍历完成,则字符串是回文串
return true;
};
4. 示例
console.log(isPalindrome('racecar')); // true
console.log(isPalindrome('madam')); // true
console.log(isPalindrome('hello')); // false
console.log(isPalindrome('A man, a plan, a canal, Panama!')); // true
5. 复杂度分析
本算法的时间复杂度为 O(n),其中 n 为字符串的长度。这是因为我们在字符串上进行两次遍历,每次遍历都需要访问字符串中的每个字符。空间复杂度为 O(1),因为我们没有使用额外的空间来存储数据。
6. 结语
LeetCode《初级算法》字符串之验证回文串问题是一道经典的字符串处理问题。我们通过将字符串转换为小写并忽略所有非字母数字的字符,然后从两端向中间遍历比较字符,从而实现了该问题的解决。
希望本文对您理解回文串的概念及其在编程中的应用有所帮助。如果您有兴趣了解更多 LeetCode 算法题目的解题思路和代码实现,欢迎访问 LeetCode 官方网站或其他相关资源。