今天又来练习力扣了,又是向大佬学习的一天,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)