这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战
跟着leedcode学习算法
题一:
验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 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
提交结果:
还有更简单的判断方法:
代码:
class Solution:
def isPalindrome(self, s: str) -> bool:
s = s.lower()
s = re.findall(r'[a-z0-9]', s)
return s==s[::-1]
执行结果:
题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
执行结果: