01.12.2025
1422. Maximum Score After Splitting a String easy blog post substack youtube deep-dive
Join me on Telegram
Problem TLDR
Max(left_zeros + right_ones) #easy
Intuition
The brute-force works: try every possible position split. The better way is two-pass: count the
total ones
, then decrease it at every step.The optimal solution is a single pass: notice, how the
sum = zeros + ones
changes at every move, we actually computing thebalance around the total ones
.
Approach
try every solution
how short can it be?
Complexity
Time complexity: $$O(n)$$
Space complexity: $$O(1)$$
Code
fun maxScore(s: String): Int {
var ones = s.last() - '0'; var b = 0
return s.dropLast(1).maxOf {
if (it > '0') { ones++; --b } else ++b
} + ones
}
pub fn max_score(s: String) -> i32 {
let (mut ones, mut b) = (0, 0);
s.bytes().enumerate().map(|(i, c)| {
ones += (c > b'0') as i32;
if i < s.len() - 1 {
b -= (c > b'0') as i32 * 2 - 1; } b
}).max().unwrap() + ones
}
int maxScore(string s) {
int o = s[s.size() - 1] == '1', b = 0, r = -1;
for (int i = 0; i < s.size() - 1; ++i) {
o += s[i] > '0';
b -= (s[i] > '0') * 2 - 1;
r = max(r, b);
} return r + o;
}