Flip String to Monotone Increasing
Description
A string of '0'
s and '1'
s is monotone increasing if it consists of some number of '0'
s (possibly 0), followed by some number of '1'
s (also possibly 0.)
We are given a string S
of '0'
s and '1'
s, and we may flip any '0'
to a '1'
or a '1'
to a '0'
.
Return the minimum number of flips to make S
monotone increasing.
Example 1:
Input: "00110" Output: 1 Explanation: We flip the last digit to get 00111.
Example 2:
Input: "010110" Output: 2 Explanation: We flip to get 011111, or alternatively 000111.
Example 3:
Input: "00011000" Output: 2 Explanation: We flip to get 00000000.
Note:
1 <= S.length <= 20000
S
only consists of'0'
and'1'
characters.
Solution(javascript)
/** DP
* @param {string} S
* @return {number}
*/
const minFlipsMonoIncr = function (S) {
const memo = {}
const aux = (index, prev) => {
memo[index] = memo[index] || {}
if (memo[index][prev] !== undefined) {
return memo[index][prev]
}
if (index >= S.length) {
return 0
}
if (prev === '0') {
if (S[index] === '0') {
memo[index][prev] = Math.min(aux(index + 1, '0'), aux(index + 1, '1') + 1)
} else {
memo[index][prev] = Math.min(aux(index + 1, '1'), aux(index + 1, '0') + 1)
}
} else if (S[index] === '0') {
memo[index][prev] = aux(index + 1, '1') + 1
} else {
memo[index][prev] = aux(index + 1, '1')
}
return memo[index][prev]
}
return aux(0, '0')
}