Skip to main content

Minimum Number of Changes to Make a Binary String Beautiful | Leetcode : 2914


Image

In this LeetCode problem, we're tasked with transforming a given binary string into a "beautiful" string. A beautiful string is one that can be partitioned into substrings, each containing only 0s or 1s and having an even length.

To achieve this beauty, we're allowed to change any character in the string to either 0 or 1. The challenge lies in determining the minimum number of such changes required.

Intuition and Approach

To solve this problem efficiently, we can employ a greedy approach. We'll iterate through the string, keeping track of the current character and the count of consecutive occurrences of that character.

  1. Iterate and Count:

    • Start with the first character and initialize a count to 1.
    • As we traverse the string, we increment the count if the current character matches the previous one.
    • If the current character is different, we've encountered a new substring.
  2. Handle Odd-Length Substrings:

    • If the current count is odd, we'll need to make a change.
      • If it's the last character, we can simply change it.
      • Otherwise, we can either change the current character or the next character to match the previous substring. We choose the option that requires fewer changes.
  3. Update the Current Character and Count:

    • After handling odd-length substrings, we update the current character and reset the count to 1 for the new substring.

Code Implementation

Here's the C++ code implementing this approach:

class Solution {
public:
    int minChanges(string s) {
        int n = s.length();
        int changes = 0, count = 1;
        char ch = s[0];

        for (int i = 1; i < n; ++i) {
            if (s[i] == ch) {
                count++;
            } else {
                if (count % 2 == 1) {
                    changes++;
                    if (i + 1 < n && s[i + 1] == ch) {
                        count = 1; // Start a new substring with the next character
                    }
                }
                ch = s[i];
                count = 1;
            }
        }

        return changes;
    }
};

Explanation of the Code:

  1. Initialization:

    • changes: Stores the total number of changes required.
    • count: Keeps track of the current character's consecutive occurrences.
    • ch: Stores the current character.
  2. Iteration:

    • We iterate through the string, starting from the second character.
    • If the current character matches the previous one, we increment the count.
    • If they don't match:
      • If the current count is odd, we need to make a change. We choose the more efficient option between changing the current character or the next character.
      • We update the ch and reset the count for the new substring.
  3. Return the Result:

    • After the loop, changes will hold the minimum number of changes required to make the string beautiful.

Time and Space Complexity:

  • Time complexity: O(N), where N is the length of the string.
  • Space complexity: O(1), as we use constant extra space.

By following this approach, we can efficiently determine the minimum number of changes needed to transform a given binary string into a beautiful one.

Popular posts from this blog

Maximum Difference Between Even and Odd Frequency | LeetCode

We are given a string consisting of lowercase English letters. Our task is to find the maximum difference between the frequency of two characters in the string such that: One of the characters has an even frequency . The other character has an odd frequency . The difference is calculated as:  odd_frequency - even_frequency We need to return the maximum possible difference between the odd and even frequencies. Example Walkthrough Let's take a couple of examples to better understand the problem: Example 1: Input:  s = "aaaaabbc" Frequencies: 'a' → 5 (odd) 'b' → 2 (even) 'c' → 1 (odd) Here, the maximum odd frequency is 5 (for 'a') and the maximum even frequency is 2 (for 'b'). Therefore, the result is: maxOdd - maxEven = 5 - 2 = 3 Example 2: Input:  s = "abcabcab" Frequencies: 'a' → 3 (odd) 'b' → 2 (even) 'c' → 2 (even) The maximum odd frequency is 3 (for 'a') and the maximum even fr...

Maximize Amount After Two Days of Conversions | Leetcode Question

When tackling the problem of maximizing the amount of currency after two days of conversions, we encounter an interesting graph-based problem that involves working with exchange rates between various currencies. In this article, we will explore this problem in detail, starting with the brute force approach and refining it to an optimized solution. Problem Explanation You are given a string initialCurrency (the starting currency), along with four arrays: pairs1 and rates1 : Represent exchange rates between currency pairs on Day 1. pairs2 and rates2 : Represent exchange rates between currency pairs on Day 2. The task is to maximize the amount of initialCurrency you can have after performing any number of conversions on both days. You can make conversions using Day 1 rates and then further conversions using Day 2 rates. Key Insights: Conversion rates are valid (no contradictions). Each currency can be converted back to its counterpart at a reciprocal rate (e.g., if USD -> EUR = 2....

Final Prices With a Special Discount in a Shop – LeetCode Solution Explained

When tackling coding problems, it's important to understand the problem thoroughly and work through solutions step-by-step. In this blog, we will explore the LeetCode problem "1475 Final Prices With a Special Discount in a Shop" . We'll walk through the problem statement, approach it with a beginner-friendly brute force solution, and analyze its time and space complexity. Finally, we'll discuss any possible optimizations to improve efficiency. Problem Statement You are given an integer array prices where prices[i] represents the price of the i th item in a shop. There is a special discount rule: If you buy the i th item, you receive a discount equal to prices[j] , where j is the smallest index such that j > i and prices[j] <= prices[i] . If no such j exists, you get no discount for that item. Your task is to return a new array answer , where answer[i] is the final price you pay for the i th item after applying the discount. Examples Example 1: Input: p...