0%

验证回文串

125. 验证回文串 [简单]

题目说明

Leetcode题目链接

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

1
2
3
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串

示例 2:

1
2
3
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串

提示:

  • 1 <= s.length <= 2 * 105
  • 字符串 s 由 ASCII 字符组成

解题思路

双指针

使用双指针 left right , 从字符串两端向中间遍历并一一比较。

  • 时间复杂度:O(n)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
private:
bool is_valid(const char& c)
{
return ((c >= '0' && c <= '9')
|| (c >= 'A' && c <= 'Z')
|| (c >= 'a' && c <= 'z'));
}
bool is_equal(const char& c1, const char& c2)
{
return tolower(c1) == tolower(c2);
}
public:
bool isPalindrome(string s) {
int left = 0;
int right = s.size() - 1;
while (left < right)
{
while (!is_valid(s[left]) && left < right)
{
left++;
}
while (!is_valid(s[right]) && left < right)
{
right--;
}
if (left < right && !is_equal(s[left], s[right]))
{
return false;
}

left++;
right--;
}

return true;
}
};