跟着leedcode刷算法 -- 字符串1

474 阅读1分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

跟着leedcode学习算法

image.png

题一:

验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama" 输出: true 解释:"amanaplanacanalpanama" 是回文串

示例 2:

输入: "race a car" 输出: false 解释:"raceacar" 不是回文串  

提示:

1 <= s.length <= 2 * 105 字符串 s 由 ASCII 字符组成

相关标签

  • 双指针
  • 字符串

代码:

双指针算法:

class Solution:
    def isPalindrome(self, s: str) -> bool:
        if len(s)==0:
            return False
        s = s.lower() # 把所有大写变成小写
        s = re.findall(r'[a-z0-9]', s) # 只保留字符串和数字
        left, right = 0, len(s)-1 
        while left < right:
            if s[left] != s[right]: 
                return False
            left +=1
            right-=1
        return True

提交结果:

image.png

还有更简单的判断方法:

代码:

class Solution:
    def isPalindrome(self, s: str) -> bool:
        s = s.lower()
        s = re.findall(r'[a-z0-9]', s)
        return s==s[::-1]

执行结果:

image.png

题2:

分割回文串

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

回文串 是正着读和反着读都一样的字符串。

 

示例 1:

输入:s = "aab" 输出:[["a","a","b"],["aa","b"]]

示例 2:

输入:s = "a" 输出:[["a"]]  

提示:

1 <= s.length <= 16 s 仅由小写英文字母组成

相关标签:

  • 字符串
  • 动态规划
  • 回溯

思路:

1.回溯算法

2.直接dfs

代码:

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        def dfs(s, item, res):
            if not s:
                res.append(item)
                return
            for i in range(len(s)):
                if s[:i+1] == s[i::-1]:
                    dfs(s[i+1:],item+[s[:i+1]],res)

        item = []
        res = []
        dfs(s,item,res)
        return res

执行结果:

image.png