【LeetCode 面试经典150题】125. Valid Palindrome 验证回文串

125. Valid Palindrome

题目大意

A phrase is a palindrome if, after converting all uppercase letters into lowercase letters and removing all non-alphanumeric characters, it reads the same forward and backward. Alphanumeric characters include letters and numbers.

Given a string s, return true if it is a palindrome, or false otherwise.

中文释义

如果一个短语在将所有大写字母转换为小写字母并去除所有非字母数字字符后,可以正读和反读都一样,那么它就是一个回文。字母数字字符包括字母和数字。

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

示例

Example 1:

Input: s = "A man, a plan, a canal: Panama"
Output: true
Explanation: "amanaplanacanalpanama" is a palindrome.

Example 2:

Input: s = "race a car"
Output: false
Explanation: "raceacar" is not a palindrome.

Example 3:

Input: s = " "
Output: true
Explanation: s is an empty string "" after removing non-alphanumeric characters.
Since an empty string reads the same forward and backward, it is a palindrome.

限制条件

1 <= s.length <= 2 * 10^5
s consists only of printable ASCII characters.

解题思路

方法

这个解决方案的目的是检查给定的字符串 s 是否是一个回文。它分为两个主要步骤:

  1. 处理字符串

    • 遍历字符串 s 中的每个字符。
    • 使用 isalnum 函数检查每个字符是否是字母或数字。如果是,将该字符转换为小写,并将其存储在字符串 s 的当前 index 位置上。然后递增 index
    • 通过这种方式,字符串 s 被原地修改,仅包含小写字母和数字,且不含任何其他字符。
  2. 判断是否为回文串

    • 设置两个指针 leftrightleft 从字符串的开始处,right 从处理后的字符串的末尾(index - 1)开始。
    • left < right 时,比较这两个指针指向的字符。如果它们相同,则继续将 left 向右移动,right 向左移动。
    • 如果在任何时候 leftright 指向的字符不同,函数返回 false
    • 如果完成整个循环而没有返回 false,则意味着字符串是回文,函数返回 true

代码

class Solution {
public:
    bool isPalindrome(string s) {
        // 处理字符串
        int index = 0;
        for (char c : s) {
            if (isalnum(c)) {
                s[index++] = tolower(c);
            }
        }
        // 判断是否回文串
        int left = 0, right = index - 1;
        while (left < right) {
            if (s[left++] != s[right--]) {
                return false;
            }
        }
        return true;
    }
};

你可能感兴趣的:(LeetCode,面试经典150题,leetcode,面试,算法)