题目-简单难度
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
示例
示例 1:
输入: s = “A man, a plan, a canal: Panama”
输出:true
解释:“amanaplanacanalpanama” 是回文串。
示例 2:
输入:s = “race a car”
输出:false
解释:“raceacar” 不是回文串。
示例 3:
输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 “” 。
由于空字符串正着反着读都一样,所以是回文串。
提示:
- 1 <= s.length <= 2 * 105
- s 仅由可打印的 ASCII 字符组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1. python自带库re删除标点符号后双指针
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
# 将标点符号去除,然后空格去除,再变为小写
s = lower(re.sub(r"[%s]+" %punctuation, "",s).replace(" ",""))
l,r = 0,len(s)-1
while l<=r:
if s[l]==s[r]:
l+=1
r-=1
else:
return False
return True
2. 正则
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
# 正则将非符号内容留下,再变为小写
s=re.sub('[^a-zA-Z0-9]','',s).lower()
# 所有回文串的共性就是,只要它等于它的倒序,那就是回文串
return s==s[::-1]
3. 用forloop遍历一半
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
s = s.lower()
s1 = ""
for n in s:
if n.isalpha() or n.isdigit():
s1 += n
# print(s1)
for i in range(len(s1)/2):
if (s1[i] != s1[len(s1)-i-1]):
return False
return True
4. 用isalpha和isdigit判断字符和数字,以此排除标点符号
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
# 先将字符串小写化
s = s.lower()
# 创建列表
s1 = ""
for n in s:
if n.isalpha() or n.isdigit():
s1+=n
return s1 == s1[::-1]