如果一个二进制字符串由一定数量的0(可能没有)和一定数量的1(也可能没有)组成,那么它就是单调增长的。
你可以翻转s[i],把它从0变成1或者从1变成0。
返回使s单调增长的最小翻转次数。
这道题对于任一个字符s[i]变与不变,如果s[i] = ‘1’ 在自身不变的情况下为了保证递增,那么就需要他前面的已经处理过的字符石以’1’或者‘0’结尾都可以。但是如果要自身发生变化,那么就需要他前面的字符串以‘0’结尾。
同理对于 s[i] = ‘0’的情况,如果自身不变,那就需要前面的字符串调整为一‘0’结尾,如果变,就看前面字符串以‘0’和以‘1’结尾的最小值即可。
func minFlipsMonoIncr(s string) int {
endWithZero, endWithOne := 0, 0
if s[0] == '0' {
endWithOne = 1
}
if s[0] == '1' {
endWithZero = 1
}
for idx := 1; idx < len(s); idx++ {
if s[idx] == '1' {
// 前一个以0结尾,目前也想以0结尾,那就需要将1修改为0
wantEndWithZero := endWithZero + 1
if endWithOne > endWithZero {
endWithOne = endWithZero
}
endWithZero = wantEndWithZero
continue
}
// 如果当前是0,那么就需要考虑,是否需要调整为1
// 以0结尾,那么直接从前一个弄过来
wantEndWithOne := endWithOne
if wantEndWithOne > endWithZero {
wantEndWithOne = endWithZero
}
wantEndWithOne++
endWithOne = wantEndWithOne
}
if endWithOne > endWithZero {
return endWithZero
}
return endWithOne
}