Description
You are given a 0-indexed string num representing a non-negative integer.
In one operation, you can pick any digit of num and delete it. Note that if you delete all the digits of num, num becomes 0.
Return the minimum number of operations required to make num special.
An integer x is considered special if it is divisible by 25.
Example 1:
Input: num = "2245047" Output: 2 Explanation: Delete digits num[5] and num[6]. The resulting number is "22450" which is special since it is divisible by 25. It can be shown that 2 is the minimum number of operations required to get a special number.
Example 2:
Input: num = "2908305" Output: 3 Explanation: Delete digits num[3], num[4], and num[6]. The resulting number is "2900" which is special since it is divisible by 25. It can be shown that 3 is the minimum number of operations required to get a special number.
Example 3:
Input: num = "10" Output: 1 Explanation: Delete digit num[0]. The resulting number is "0" which is special since it is divisible by 25. It can be shown that 1 is the minimum number of operations required to get a special number.
Constraints:
1 <= num.length <= 100numonly consists of digits'0'through'9'.numdoes not contain any leading zeros.
Solutions
Solution 1: Memoization Search
We notice that an integer x can be divisible by 25, i.e., x \bmod 25 = 0. Therefore, we can design a function dfs(i, k), which represents the minimum number of digits to be deleted to make the number a special number, starting from the ith digit of the string num, and the current number modulo 25 is k. The answer is dfs(0, 0).
The execution logic of the function dfs(i, k) is as follows:
- If i = n, i.e., all digits of the string num have been processed, then if k = 0, the current number can be divisible by 25, return 0, otherwise return n;
- Otherwise, the ith digit can be deleted, in this case one digit needs to be deleted, i.e., dfs(i + 1, k) + 1; if the ith digit is not deleted, then the value of k becomes (k × 10 + num[i]) \bmod 25, i.e., dfs(i + 1, (k × 10 + num[i]) \bmod 25). Take the minimum of these two.
To prevent repeated calculations, we can use memoization to optimize the time complexity.
The time complexity is O(n × 25), and the space complexity is O(n × 25). Here, n is the length of the string num.
class Solution: def minimumOperations(self, num: str) -> int: @cache def dfs(i: int, k: int) -> int: if i == n: return 0 if k == 0 else n ans = dfs(i + 1, k) + 1 ans = min(ans, dfs(i + 1, (k * 10 + int(num[i])) % 25)) return ans n = len(num) return dfs(0, 0)(code-box)
