LeetCode_Python_回文串或回文数系列一_简单

回文简介

回文数:指正序(从左向右)和倒序(从右向左)读都是一样的整数。
回文串:如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。字母和数字都属于字母数字字符。空字符可以根据题意看是否被认为是回文串。
回文子序列:将原序列删除某些元素后,元素按原顺序排列是回文。

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值