Python leetcode 2844 生成特殊字的最少操作,力扣练习,贪心解法代码实践

今天又来练习力扣了,又是向大佬学习的一天,leetcode 2844 生成特殊字的最少操作

1.题目

给你一个下标从 0 开始的字符串 num ,表示一个非负整数。

在一次操作中,您可以选择 num 的任意一位数字并将其删除。请注意,如果你删除 num 中的所有数字,则 num 变为 0

返回最少需要多少次操作可以使 num 变成特殊数字。

如果整数 x 能被 25 整除,则该整数 x 被认为是特殊数字。

示例 1:

输入:num = "2245047"
输出:2
解释:删除数字 num[5] 和 num[6] ,得到数字 "22450" ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 2 位数字。

示例 2:

输入:num = "2908305"
输出:3
解释:删除 num[3]、num[4] 和 num[6] ,得到数字 "2900" ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 3 位数字。

示例 3:

输入:num = "10"
输出:1
解释:删除 num[0] ,得到数字 "0" ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 1 位数字。

提示

  • 1 <= num.length <= 100
  • num 仅由数字 '0' 到 '9' 组成
  • num 不含任何前导零

2.题解思路

我用的记忆化搜索,但是灵神的思路更为巧妙,贪心解法。 

一个数能被 252525 整除,有如下五种情况:

这个数是 000。
这个数的末尾是 000000。
这个数的末尾是 252525。
这个数的末尾是 505050。
这个数的末尾是 757575。

class Solution:
    def minimumOperations(self, num: str) -> int:
        n = len(num)
        def func(tail):
            i = num.rfind(tail[1])
            if i < 0:
                return n
            i = num.rfind(tail[0], 0, i)
            if i < 0:
                return n
            return n - i - 2
        return min(n - ('0' in num), func('00'), func('25'), func('50'), func('75'))

时间复杂度O(n)

空间复杂度O(1)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

医学小达人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值