
目录
1. 全排列 II ★★
2. 跳跃游戏 II ★★
3. 通配符匹配 ★★
1. 全排列 II
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2] 输出:[[1,1,2], [1,2,1], [2,1,1]]
示例 2:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示:
1 <= nums.length <= 8-10 <= nums[i] <= 10
代码:
from typing import List
class Solution:
def permuteUnique(self, nums: list) -> list:
ans = []
if len(nums) == 0:
return
if len(nums) == 1:
return [nums]
for index,item in enumerate(nums):
res = nums[:index]+nums[index+1:]
for j in self.permuteUnique(res):
ans.append(j+[item])
rel = []
for i in ans:
if i not in rel:
rel.append(i)
return rel
# %%
s = Solution()
print(s.permuteUnique(nums = [1,2,3]))
输出:
[[2, 1, 1], [1, 2, 1], [1, 1, 2]]
[[3, 2, 1], [2, 3, 1], [3, 1, 2], [1, 3, 2], [2, 1, 3], [1, 2, 3]]
2. 跳跃游戏 II
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。
代码:
class Solution:
def jump(self, nums):
if len(nums) <= 1:
return 0
end = 0 + nums[0]
start = 0
step = 1
maxDis = 0 + nums[0]
while end < len(nums) - 1:
for i in range(start + 1, end + 1):
maxDis = max(maxDis, nums[i] + i)
start = end
end = maxDis
step += 1
return step
# %%
s = Solution()
print(s.jump(nums = [2,3,1,1,4]))
输出:
2
3. 通配符匹配
给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。
'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
s可能为空,且只包含从a-z的小写字母。p可能为空,且只包含从a-z的小写字母,以及字符?和*。
示例 1:
输入:s = "aa", p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:s = "aa", p = "*" 输出: true 解释: '*' 可以匹配任意字符串。
示例 3:
输入:s = "cb", p = "?a" 输出: false 解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
示例 4:
输入:s = "adceb", p = "*a*b" 输出: true 解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".
示例 5:
输入:s = "acdcb", p = "a*c?b" 输出: false
代码:
class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
s_index, p_index = 0, 0
star, s_star = -1, 0
s_len, p_len = len(s), len(p)
while s_index < s_len:
if p_index < p_len and (s[s_index] == p[p_index] or p[p_index] == '?'):
s_index += 1
p_index += 1
elif p_index < p_len and p[p_index] == '*':
star = p_index
s_star = s_index
p_index += 1
elif star != -1:
p_index = star + 1
s_star += 1
s_index = s_star
else:
return False
while p_index < p_len and p[p_index] == '*':
p_index += 1
return p_index == p_len
if __name__ == '__main__':
s = Solution()
print (s.isMatch(s = "aa",p = "a"))
print (s.isMatch(s = "aa",p = "*"))
print (s.isMatch(s = "cb", p = "?a"))
print (s.isMatch(s = "adceb", p = "*a*b"))
print (s.isMatch(s = "acdcb", p = "a*c?b"))
输出:
False
True
False
True
False
🌟 每日一练刷题专栏
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
★ 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
| C/C++ 每日一练 专栏 |
| Python 每日一练 专栏 |

文章提供了三个编程题目,分别是全排列II,要求返回重复数字序列的所有不重复全排列;跳跃游戏II,目标是最少跳跃次数到达数组最后位置;通配符匹配,实现支持*和?的字符串匹配功能。每道题都给出了Python代码实现和示例测试用例。
3万+

被折叠的 条评论
为什么被折叠?



