目录
回文简介
回文数:指正序(从左向右)和倒序(从右向左)读都是一样的整数。
回文串:如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。字母和数字都属于字母数字字符。空字符可以根据题意看是否被认为是回文串。
回文子序列:将原序列删除某些元素后,元素按原顺序排列是回文。
type1
将原字符串与反转的字符串进行对比
9. 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
class Solution:
def isPalindrome(self, x: int) -> bool:
s=str(x)
return s == s[::-1]
1332. 删除回文子序列
给你一个字符串 s,仅由字母 ‘a’ 和 ‘b’ 组成。每一次删除 s 中的一个回文 子序列。返回删除字符串中所有字符(字符串为空)的最小删除次数。
class Solution:
def removePalindromeSub(self, s: str) -> int:
return 1 if s == s[::-1] else 2 #若原串是回文,则1次;若不是,可先删除全'a',再删除'b',2次即可
2108. 找出数组中的第一个回文字符串
给你一个字符串数组 words ,返回数组中的 第一个回文字符串 。如果不存在,返回 “” 。
class Solution:
def firstPalindrome(self, words: List[str]) -> str:
for word in words:
if word==word[::-1]:
return word
return ''
type2
将字符串中所有字母变小/大写、非字母数字符号空变为字符,再原字符与反转字符对比
125. 验证回文串
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
class Solution:
def isPalindrome(self, s: str) -> bool:
s = ''.join([ss if ss.isalnum() else '' for ss in s.lower()])
return s == s[::-1]
剑指 Offer II 018. 有效的回文
给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。
class Solution:
def isPalindrome(self, s: str) -> bool:
s = ''.join([ss if ss.isalnum() else '' for ss in s.lower()])
return s==s[::-1]
type3
统计字符串单字符词频,对奇偶进行不同考虑
面试题 01.04. 回文排列
给定一个字符串s,判定其是否为某个回文串的排列之一。
class Solution:
def canPermutePalindrome(self, s: str) -> bool:
import collections
return len([key for key,val in collections.Counter(s).items() if val%2==1])<=1
409. 最长回文串
给定一个包含大小写字母的字符串 s ,返回 这些字母构造成的 最长的回文串 。区分大小写。
class Solution:
def longestPalindrome(self, s: str) -> int:
import collections
cnt=0
ans=[]
for key,val in collections.Counter(s).items():
if val%2==0:
cnt+=val
else:
cnt+=val-1
ans.append(key)
return cnt if len(ans)==0 else cnt+1
type4
双指针法,双向逼近。
当两元素相同时,左右都往中间移动一位;若不同,则删除左或右,再判断是否是回文串。
若都满足,则返回True。
680. 验证回文串 II
给你一个字符串 s,最多 可以从中删除一个字符。判断是否能成为回文串。
class Solution:
def validPalindrome(self, s: str) -> bool:
def check(substr):
i,j=0,len(substr)-1
while i<j:
if substr[i]!=substr[j]:
return False
i+=1
j-=1
return True
left,right=0,len(s)-1
while left<right and s[left]==s[right]:
left+=1
right-=1
if left<right:
return check(s[left+1:right+1]) or check(s[left:right])
return True