leetcode 125【验证回文串】
题目链接
https://leetcode-cn.com/problems/valid-palindrome/
解题思路与代码思路:
逆序判断
对字符串 ss 进行一次遍历,并将其中的字母和数字字符进行保留,放在另一个字符串 \textit{sgood}sgood 中。这样我们只需要判断 \textit{sgood}sgood 是否是一个普通的回文串即可。
双指针(原地该字符串)
我们直接在原字符串 ss 上使用双指针。在移动任意一个指针时,需要不断地向另一指针的方向移动,直到遇到一个字母或数字字符,或者两指针重合为止。也就是说,我们每次将指针移到下一个字母字符或数字字符,再判断这两个指针指向的字符是否相同。
代码:
逆序判断
class Solution:
def isPalindrome(self, s: str) -> bool:
# 转成小写,去掉其他字符,反向是否相等
temp = []
s = s.lower()
for i in s:
if i.isalnum():
temp.append(i)
return temp == temp[::-1]
另一种写法
class Solution:
def isPalindrome(self, s: str) -> bool:
snice = "".join(i.lower() for i in s if i.isalnum())
return snice == snice[::-1]
双指针(原地该字符串)
class Solution:
def isPalindrome(self, s: str) -> bool:
i = 0
j = len(s)-1
while i<j:
while i<j and not s[i].isalnum():
i += 1
while i<j and not s[j].isalnum():
j -= 1
if i<j:
if s[i].lower() != s[j].lower():
return False
i+=1
j-=1
return True
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
- 逆序判断
- 时间复杂度:O(S)
- 空间复杂度:O(S)
- 双指针
- 时间复杂度:O(S)
- 空间复杂度:O(1)