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 <= 20000Sonly 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')
}