leetcode: 验证回文串

70 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

题目描述

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

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

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。

示例 1:

输入: "A man, a plan, a canal: Panama"

输出: true

示例 2:

输入: "race a car"

输出: false

题目地址: 125. 验证回文串

思路

这是一道考察回文的题目,而且是最简单的形式,即判断一个字符串是否是回文。

针对这个问题,我们可以使用头尾双指针,初始时,左右指针分别指向字符串的两侧,随后我们不断地将这两个指针相向移动,每次移动一步,并判断这两个指针指向的字符是否相同。当这两个指针相遇时,就说明该字符串是回文串。

  • 如果两个指针的元素不相同,则直接返回 false,
  • 如果两个指针的元素相同,我们同时更新头尾指针,循环。 直到头尾指针相遇。

时间复杂度为 O(n).

代码:


function isValid(c) {
    const charCode = c.charCodeAt(0);
    const isDigit =
    charCode >= "0".charCodeAt(0) && charCode <= "9".charCodeAt(0);
    const isChar = charCode >= "a".charCodeAt(0) && charCode <= "z".charCodeAt(0);
    return isDigit || isChar;
}


var isPalindrome = function (s) {
    s = s.toLowerCase();
    let left = 0;
    let right = s.length - 1;

    while (left < right) {
        if (!isValid(s[left])) {
            left++;
            continue;
        }

        if (!isValid(s[right])) {
            right--;
            continue;
        }

        if (s[left] === s[right]) {
            left++;
            right--;
        } else {
            break;
        }
    }
    return right <= left;

};

总结:

本题考查的是语言中常用字符(串)相关 API 的使用。

  • toLowerCase() 方法用于把字符串转换为小写。
  • charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。