Python每日一练(20230313) 全排列II、跳跃游戏II、通配符匹配

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

目录

1. 全排列 II  ★★

2. 跳跃游戏 II  ★★

3. 通配符匹配  ★★

🌟 每日一练刷题专栏

C/C++ 每日一练 ​专栏

Python 每日一练 专栏


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 每日一练 专栏

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hann Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值