题意

如果一个二进制字符串由一定数量的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
}