Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Move from brute-force thinking to an efficient approach using core interview patterns strategy.
You are given a 0-indexed binary string s having an even length.
A string is beautiful if it's possible to partition it into one or more substrings such that:
1's or only 0's.You can change any character in s to 0 or 1.
Return the minimum number of changes required to make the string s beautiful.
Example 1:
Input: s = "1001" Output: 2 Explanation: We change s[1] to 1 and s[3] to 0 to get string "1100". It can be seen that the string "1100" is beautiful because we can partition it into "11|00". It can be proven that 2 is the minimum number of changes needed to make the string beautiful.
Example 2:
Input: s = "10" Output: 1 Explanation: We change s[1] to 1 to get string "11". It can be seen that the string "11" is beautiful because we can partition it into "11". It can be proven that 1 is the minimum number of changes needed to make the string beautiful.
Example 3:
Input: s = "0000" Output: 0 Explanation: We don't need to make any changes as the string "0000" is beautiful already.
Constraints:
2 <= s.length <= 105s has an even length.s[i] is either '0' or '1'.Problem summary: You are given a 0-indexed binary string s having an even length. A string is beautiful if it's possible to partition it into one or more substrings such that: Each substring has an even length. Each substring contains only 1's or only 0's. You can change any character in s to 0 or 1. Return the minimum number of changes required to make the string s beautiful.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: General problem-solving
"1001"
"10"
"0000"
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #2914: Minimum Number of Changes to Make Binary String Beautiful
class Solution {
public int minChanges(String s) {
int ans = 0;
for (int i = 1; i < s.length(); i += 2) {
if (s.charAt(i) != s.charAt(i - 1)) {
++ans;
}
}
return ans;
}
}
// Accepted solution for LeetCode #2914: Minimum Number of Changes to Make Binary String Beautiful
func minChanges(s string) (ans int) {
for i := 1; i < len(s); i += 2 {
if s[i] != s[i-1] {
ans++
}
}
return
}
# Accepted solution for LeetCode #2914: Minimum Number of Changes to Make Binary String Beautiful
class Solution:
def minChanges(self, s: str) -> int:
return sum(s[i] != s[i - 1] for i in range(1, len(s), 2))
// Accepted solution for LeetCode #2914: Minimum Number of Changes to Make Binary String Beautiful
// Rust example auto-generated from java reference.
// Replace the signature and local types with the exact LeetCode harness for this problem.
impl Solution {
pub fn rust_example() {
// Port the logic from the reference block below.
}
}
// Reference (java):
// // Accepted solution for LeetCode #2914: Minimum Number of Changes to Make Binary String Beautiful
// class Solution {
// public int minChanges(String s) {
// int ans = 0;
// for (int i = 1; i < s.length(); i += 2) {
// if (s.charAt(i) != s.charAt(i - 1)) {
// ++ans;
// }
// }
// return ans;
// }
// }
// Accepted solution for LeetCode #2914: Minimum Number of Changes to Make Binary String Beautiful
function minChanges(s: string): number {
let ans = 0;
for (let i = 1; i < s.length; i += 2) {
if (s[i] !== s[i - 1]) {
++ans;
}
}
return ans;
}
Use this to step through a reusable interview workflow for this problem.
Two nested loops check every pair or subarray. The outer loop fixes a starting point, the inner loop extends or searches. For n elements this gives up to n²/2 operations. No extra space, but the quadratic time is prohibitive for large inputs.
Most array problems have an O(n²) brute force (nested loops) and an O(n) optimal (single pass with clever state tracking). The key is identifying what information to maintain as you scan: a running max, a prefix sum, a hash map of seen values, or two pointers.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.