Welcome to Subscribe On Youtube
1702. Maximum Binary String After Change
Description
You are given a binary string binary consisting of only 0's or 1's. You can apply each of the following operations any number of times:
- Operation 1: If the number contains the substring
"00", you can replace it with"10".- For example,
"00010" -> "10010"
- For example,
- Operation 2: If the number contains the substring
"10", you can replace it with"01".- For example,
"00010" -> "00001"
- For example,
Return the maximum binary string you can obtain after any number of operations. Binary string x is greater than binary string y if x's decimal representation is greater than y's decimal representation.
Example 1:
Input: binary = "000110" Output: "111011" Explanation: A valid transformation sequence can be: "000110" -> "000101" "000101" -> "100101" "100101" -> "110101" "110101" -> "110011" "110011" -> "111011"
Example 2:
Input: binary = "01" Output: "01" Explanation: "01" cannot be transformed any further.
Constraints:
1 <= binary.length <= 105binaryconsist of'0'and'1'.
Solutions
Solution 1: Quick Thinking
We observe that operation 2 can move all $1$s to the end of the string, and operation 1 can change all 0000..000 strings to 111..110.
Therefore, to get the maximum binary string, we should move all $1$s that are not at the beginning to the end of the string, making the string in the form of 111..11...00..11, and then use operation 1 to change the middle 000..00 to 111..10. In this way, we can finally get a binary string that contains at most one $0$, which is the maximum binary string we are looking for.
The time complexity is $O(n)$, where $n$ is the length of the string binary. Ignoring the space consumption of the answer, the space complexity is $O(1)$.
-
class Solution { public String maximumBinaryString(String binary) { int k = binary.indexOf('0'); if (k == -1) { return binary; } int n = binary.length(); for (int i = k + 1; i < n; ++i) { if (binary.charAt(i) == '0') { ++k; } } char[] ans = binary.toCharArray(); Arrays.fill(ans, '1'); ans[k] = '0'; return String.valueOf(ans); } } -
class Solution { public: string maximumBinaryString(string binary) { int k = binary.find('0'); if (k == binary.npos) return binary; int n = binary.size(); for (int i = k + 1; i < n; ++i) { if (binary[i] == '0') { ++k; } } return string(k, '1') + '0' + string(n - k - 1, '1'); } }; -
class Solution: def maximumBinaryString(self, binary: str) -> str: k = binary.find('0') if k == -1: return binary k += binary[k + 1 :].count('0') return '1' * k + '0' + '1' * (len(binary) - k - 1) -
func maximumBinaryString(binary string) string { k := strings.IndexByte(binary, '0') if k == -1 { return binary } for _, c := range binary[k+1:] { if c == '0' { k++ } } ans := []byte(binary) for i := range ans { ans[i] = '1' } ans[k] = '0' return string(ans) } -
function maximumBinaryString(binary: string): string { let k = binary.indexOf('0'); if (k === -1) { return binary; } k += binary.slice(k + 1).split('0').length - 1; return '1'.repeat(k) + '0' + '1'.repeat(binary.length - k - 1); } -
public class Solution { public string MaximumBinaryString(string binary) { int k = binary.IndexOf('0'); if (k == -1) { return binary; } k += binary.Substring(k + 1).Count(c => c == '0'); return new string('1', k) + '0' + new string('1', binary.Length - k - 1); } } -
impl Solution { pub fn maximum_binary_string(binary: String) -> String { if let Some(k) = binary.find('0') { let k = k + binary[k + 1..] .chars() .filter(|&c| c == '0') .count(); return format!("{}{}{}", "1".repeat(k), "0", "1".repeat(binary.len() - k - 1)); } binary } }