动态规划,求解《926. 将字符串翻转到单调递增》

例题

926. 将字符串翻转到单调递增

如果一个二进制字符串,是以一些 0(可能没有 0)后面跟着一些 1(也可能没有 1)的形式组成的,那么该字符串是 单调递增 的。
给你一个二进制字符串 s,你可以将任何 0 翻转为 1 或者将 1 翻转为 0 。
返回使 s 单调递增的最小翻转次数。

答案

动态规划

var minFlipsMonoIncr = function(s) {
  let s0 = s1 = 0
  for (let i = 0; i < s.length; i++) {
    s1 = Math.min(s0, s1) + 1 - s[i]
    s0 += +s[i]
  }
  return Math.min(s0, s1)
};
function minFlipsMonoIncr(s: string): number {
  let s0 = 0, s1 = 0
  for (let i = 0; i < s.length; i++) {
    s1 = Math.min(s0, s1) + 1 - +s[i]
    s0 += +s[i]
  }
  return Math.min(s0, s1)
};
class Solution {
  function minFlipsMonoIncr($s) {
    $s0 = $s1 = 0;
    $n = strlen($s);
    for ($i = 0; $i < $n; $i++) {
      $s1 = min($s0, $s1) + 1 - $s[$i];
      $s0 += $s[$i];
    }
    return min($s0, $s1);
  }
}
func minFlipsMonoIncr(s string) int {
  s0, s1 := 0, 0
  for _, c := range s {
    s1 = min(s0, s1) + 1 - (int(c) - 48)
    s0 += int(c) - 48
  }
  return min(s0, s1)
}
func min(a int, b int) int {
  if a < b {
    return a
  }
  return b
}
class Solution {
  public int minFlipsMonoIncr(String s) {
    int s0 = 0, s1 = 0;
    char[] chars = s.toCharArray();
    for (char c : chars) {
      s1 = Math.min(s0, s1) + '1' - c;
      s0 += c - '0';
    }
    return Math.min(s0, s1);
  }
}
class Solution:
  def minFlipsMonoIncr(self, s: str) -> int:
    s0, s1 = 0, 0
    for _, c in enumerate(s):
      s1 = min(s0, s1) + 1 - int(c)
      s0 += int(c)
    return min(s0, s1)
int minFlipsMonoIncr(char * s){
  int s0 = 0, s1 = 0;
  int n = strlen(s);
  for (int i = 0; i < n; i++) {
    s1 = min(s0, s1) + 1 - s[i] + 48;
    s0 += s[i] - 48;
  }
  return min(s0, s1);
}
int min(int a, int b) {
  return a < b ? a : b;
}
class Solution {
public:
  int minFlipsMonoIncr(string s) {
    int s0 = 0, s1 = 0;
    for (char c : s) {
      s1 = min(s0, s1) + 1 - c + 48;
      s0 += c - 48;
    }
    return min(s0, s1);
  }
};
public class Solution {
  public int MinFlipsMonoIncr(string s) {
    int s0 = 0, s1 = 0;
    int n = s.Length;
    for (int i = 0; i < n; i++) {
      s1 = Math.Min(s0, s1) + 1 - s[i] + 48;
      s0 += s[i] - 48;
    }
    return Math.Min(s0, s1);
  }
}

动态规划,可以自定义颜色数:求解《剑指 Offer II 091. 粉刷房子》
动态规划,可以自定义颜色数,求解《剑指 Offer II 091. 粉刷房子》
字符串的 Unicode 码与字符转换,求解《709. 转换成小写字母》《1309. 解码字母到整数映射》和《953. 验证外星语词典》
字符串的 Unicode 码与字符本身的转换,求解《709. 转换成小写字母》《1309. 解码字母到整数映射》和《953. 验证外星语词典》
哈希映射 + 滑动窗口:求解《438. 找到字符串中所有字母异位词》和《30. 串联所有单词的子串》
哈希映射 + 滑动窗口,求解《438. 找到字符串中所有字母异位词》和《30. 串联所有单词的子串》