You are given a 0-indexed binary string floor, which represents the colors of tiles on a floor:
floor[i] = '0' denotes that the ith tile of the floor is colored black.
On the other hand, floor[i] = '1' denotes that the ith tile of the floor is colored white.
You are also given numCarpets and carpetLen. You have numCarpetsblack carpets, each of length carpetLen tiles. Cover the tiles with the given carpets such that the number of white tiles still visible is minimum. Carpets may overlap one another.
Return the minimum number of white tiles still visible.
Example 1:
Input: floor = "10110101", numCarpets = 2, carpetLen = 2
Output: 2
Explanation:
The figure above shows one way of covering the tiles with the carpets such that only 2 white tiles are visible.
No other way of covering the tiles with the carpets can leave less than 2 white tiles visible.
Example 2:
Input: floor = "11111", numCarpets = 2, carpetLen = 3
Output: 0
Explanation:
The figure above shows one way of covering the tiles with the carpets such that no white tiles are visible.
Note that the carpets are able to overlap one another.
Constraints:
1 <= carpetLen <= floor.length <= 1000
floor[i] is either '0' or '1'.
1 <= numCarpets <= 1000
Solutions
Solution 1: Memoization Search
We design a function \(\textit{dfs}(i, j)\) to represent the minimum number of white tiles that are not covered starting from index \(i\) using \(j\) carpets. The answer is \(\textit{dfs}(0, \textit{numCarpets})\).
For index \(i\), we discuss the following cases:
If \(i \ge n\), it means all tiles have been covered, return \(0\);
If \(\textit{floor}[i] = 0\), then we do not need to use a carpet, just skip it, i.e., \(\textit{dfs}(i, j) = \textit{dfs}(i + 1, j)\);
If \(j = 0\), then we can directly use the prefix sum array \(s\) to calculate the number of remaining uncovered white tiles, i.e., \(\textit{dfs}(i, j) = s[n] - s[i]\);
If \(\textit{floor}[i] = 1\), then we can choose to use a carpet or not, and take the minimum of the two, i.e., \(\textit{dfs}(i, j) = \min(\textit{dfs}(i + 1, j), \textit{dfs}(i + \textit{carpetLen}, j - 1))\).
We use memoization search to solve this problem.
The time complexity is \(O(n \times m)\), and the space complexity is \(O(n \times m)\). Here, \(n\) and \(m\) are the length of the string \(\textit{floor}\) and the value of \(\textit{numCarpets}\), respectively.