1. 题目地址
2. 题目描述
- 英文描述
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
Note: For the purpose of this problem, we define empty string as valid palindrome.
Example 1:
Input: "A man, a plan, a canal: Panama"
Output: true
Example 2:
Input: "race a car"
Output: false
- 中文描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
3. 解题思路
- 这是一道最简单的考察回文串的题目,就是判断一个字符串是不是回文。
- 解题重点:双指针
(1)采用双指针:一个头指针,一个尾指针,分别指向字符串的头和尾。
(2)若两个指针上的元素不相同,则直接返回False,结束判断。
(3)若两个指针上的元素相同,则头指针向后一步,尾指针向前进一步,头尾指针同时更新,直到头尾指针相遇,返回True;或者所指的元素出现不相同的情况,返回False。
(4)时间复杂度:O(n)
(5)空间复杂度:O(1) - 注意1:题目要求是只考虑数字和字母,所以对字符串中出现的其他字符就不要做任何处理和判断了。判断是否是数字和字母,可以采用**isalnum()**方法。
以python中的用法为例:str.isalnum()
用来检测字符串是否由字母和数字组成,是就返回True,否则返回False。
例1:
str = “this2009”
print(str.isalnum())
True
例2:
str = “this is string example…wow!!!”
print(str.isalnum())
False
- 注意2:题目要求是忽略字母大小写,所以在判断元素是否相等时,可以统计转换成大写或者小写字母,再进行判断。
以python中的用法为例:
(1)str.lower() 方法是将字符串中所有的大写字符转换为小写。
(2)str.upper() 方法是将字符串中所有的小写字符转换为大写。
4. 解题关键
- 要想到头尾双指针的操作
- 第1步:两个指针,一个指向头,一个指向尾。
- 第2步:若头尾指针上的元素不相等,直接返回False,结束。
- 第3步:若头尾指针上的元素相等,同时更新前进,直到头尾指针相遇或者出现不相等。
- 要点
- 只考虑数字和字母:用str.isalnum()判断。
- 忽略字母大小写:统一成str.lower()或str.upper()再比较。
- 复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)
5. 更pythonic的方式
- 去掉无关字符,直接判断是否回文串
- 第1步:将字符串中的数字和字母按顺序取出。
- 第2步:将大写的字母转化为小写字母添加到一个新的字符串中。
- 第3步:判断是否回文字符(s[::-1] == s)。
6. 示例代码
python
# coding:utf-8
'''
# @Method:头尾双指针
# @Author: wlhr62
import os
class Solution1:
def isPalindrome(self, s: str) -> bool:
left = 0
right = len(s) - 1
while left < right:
if not s[left].isalnum():
left += 1
continue
if not s[right].isalnum():
right -= 1
continue
if s[left].lower() == s[right].lower():
left += 1
right -= 1
continue
else:
break
return right <= left
class Solution2:
def isPalindrome(self, s: str) -> bool:
s_new = ''.join(filter(str.isalnum, s)).lower()
return s_new[::-1] == s_new
if __name__ == "__main__":
str1 = "A man, a plan, a canal: Panama"
str2 = "race a car"
A = Solution1()
# A = Solution2()
res1 = A.isPalindrome(str1)
print(str1 + "的判断结果:", res1)
res2 = A.isPalindrome(str2)
print(str2 + "的判断结果:", res2)
运行结果
A man, a plan, a canal: Panama的判断结果: True
race a car的判断结果: False
在leetcode上AC的结果: