Skip to content

Commit 88aece0

Browse files
committed
feat: add solutions to lc problem: No.1702
No.1702.Maximum Binary String After Change
1 parent 1ad8574 commit 88aece0

File tree

6 files changed

+194
-6
lines changed

6 files changed

+194
-6
lines changed

solution/1700-1799/1702.Maximum Binary String After Change/README.md

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
<ul>
1212
<li>操作 1 :如果二进制串包含子字符串 <code>"00"</code> ,你可以用 <code>"10"</code> 将其替换。
13-
1413
<ul>
1514
<li>比方说, <code>"<strong>00</strong>010" -> "<strong>10</strong>010"</code></li>
1615
</ul>
@@ -20,7 +19,6 @@
2019
<li>比方说, <code>"000<strong>10</strong>" -> "000<strong>01</strong>"</code></li>
2120
</ul>
2221
</li>
23-
2422
</ul>
2523

2624
<p>请你返回执行上述操作任意次以后能得到的 <strong>最大二进制字符串</strong> 。如果二进制字符串 <code>x</code> 对应的十进制数字大于二进制字符串 <code>y</code> 对应的十进制数字,那么我们称二进制字符串<em> </em><code>x</code><em> </em>大于二进制字符串<em> </em><code>y</code><em> </em>。</p>
@@ -61,22 +59,94 @@
6159

6260
<!-- 这里可写通用的实现逻辑 -->
6361

62+
**方法一:脑筋急转弯**
63+
64+
我们观察发现,操作 2 可以把所有的 $1$ 都移动到字符串的末尾,而操作 1 可以把所有的 `0000..000` 串变为 `111..110`
65+
66+
因此,要想得到最大的二进制串,我们应该把所有不在开头的 $1$ 移动到字符串末尾,使得字符串变为 `111..11...00..11` 的形式,然后借助操作 1 把中间的 `000..00` 变为 `111..10`。这样我们最终可以得到一个最多包含一个 $0$ 的二进制字符串,这个字符串就是我们要求的最大二进制串。
67+
68+
时间复杂度 $O(n)$,忽略答案的空间消耗,空间复杂度 $O(1)$。其中 $n$ 为字符串 `binary` 的长度。
69+
6470
<!-- tabs:start -->
6571

6672
### **Python3**
6773

6874
<!-- 这里可写当前语言的特殊实现逻辑 -->
6975

7076
```python
71-
77+
class Solution:
78+
def maximumBinaryString(self, binary: str) -> str:
79+
k = binary.find('0')
80+
if k == -1:
81+
return binary
82+
k += binary[k + 1:].count('0')
83+
return '1' * k + '0' + '1' * (len(binary) - k - 1)
7284
```
7385

7486
### **Java**
7587

7688
<!-- 这里可写当前语言的特殊实现逻辑 -->
7789

7890
```java
91+
class Solution {
92+
public String maximumBinaryString(String binary) {
93+
int k = binary.indexOf('0');
94+
if (k == -1) {
95+
return binary;
96+
}
97+
int n = binary.length();
98+
for (int i = k + 1; i < n; ++i) {
99+
if (binary.charAt(i) == '0') {
100+
++k;
101+
}
102+
}
103+
char[] ans = binary.toCharArray();
104+
Arrays.fill(ans, '1');
105+
ans[k] = '0';
106+
return String.valueOf(ans);
107+
}
108+
}
109+
```
110+
111+
### **C++**
112+
113+
```cpp
114+
class Solution {
115+
public:
116+
string maximumBinaryString(string binary) {
117+
int k = binary.find('0');
118+
if (k == binary.npos) return binary;
119+
int n = binary.size();
120+
for (int i = k + 1; i < n; ++i) {
121+
if (binary[i] == '0') {
122+
++k;
123+
}
124+
}
125+
return string(k, '1') + '0' + string(n - k - 1, '1');
126+
}
127+
};
128+
```
79129
130+
### **Go**
131+
132+
```go
133+
func maximumBinaryString(binary string) string {
134+
k := strings.IndexByte(binary, '0')
135+
if k == -1 {
136+
return binary
137+
}
138+
for _, c := range binary[k+1:] {
139+
if c == '0' {
140+
k++
141+
}
142+
}
143+
ans := []byte(binary)
144+
for i := range ans {
145+
ans[i] = '1'
146+
}
147+
ans[k] = '0'
148+
return string(ans)
149+
}
80150
```
81151

82152
### **...**

solution/1700-1799/1702.Maximum Binary String After Change/README_EN.md

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
<ul>
1010
<li>Operation 1: If the number contains the substring <code>&quot;00&quot;</code>, you can replace it with <code>&quot;10&quot;</code>.
11-
1211
<ul>
1312
<li>For example, <code>&quot;<u>00</u>010&quot; -&gt; &quot;<u>10</u>010</code>&quot;</li>
1413
</ul>
@@ -18,7 +17,6 @@
1817
<li>For example, <code>&quot;000<u>10</u>&quot; -&gt; &quot;000<u>01</u>&quot;</code></li>
1918
</ul>
2019
</li>
21-
2220
</ul>
2321

2422
<p><em>Return the <strong>maximum binary string</strong> you can obtain after any number of operations. Binary string <code>x</code> is greater than binary string <code>y</code> if <code>x</code>&#39;s decimal representation is greater than <code>y</code>&#39;s decimal representation.</em></p>
@@ -60,13 +58,77 @@
6058
### **Python3**
6159

6260
```python
63-
61+
class Solution:
62+
def maximumBinaryString(self, binary: str) -> str:
63+
k = binary.find('0')
64+
if k == -1:
65+
return binary
66+
k += binary[k + 1:].count('0')
67+
return '1' * k + '0' + '1' * (len(binary) - k - 1)
6468
```
6569

6670
### **Java**
6771

6872
```java
73+
class Solution {
74+
public String maximumBinaryString(String binary) {
75+
int k = binary.indexOf('0');
76+
if (k == -1) {
77+
return binary;
78+
}
79+
int n = binary.length();
80+
for (int i = k + 1; i < n; ++i) {
81+
if (binary.charAt(i) == '0') {
82+
++k;
83+
}
84+
}
85+
char[] ans = binary.toCharArray();
86+
Arrays.fill(ans, '1');
87+
ans[k] = '0';
88+
return String.valueOf(ans);
89+
}
90+
}
91+
```
92+
93+
### **C++**
94+
95+
```cpp
96+
class Solution {
97+
public:
98+
string maximumBinaryString(string binary) {
99+
int k = binary.find('0');
100+
if (k == binary.npos) return binary;
101+
int n = binary.size();
102+
for (int i = k + 1; i < n; ++i) {
103+
if (binary[i] == '0') {
104+
++k;
105+
}
106+
}
107+
return string(k, '1') + '0' + string(n - k - 1, '1');
108+
}
109+
};
110+
```
69111
112+
### **Go**
113+
114+
```go
115+
func maximumBinaryString(binary string) string {
116+
k := strings.IndexByte(binary, '0')
117+
if k == -1 {
118+
return binary
119+
}
120+
for _, c := range binary[k+1:] {
121+
if c == '0' {
122+
k++
123+
}
124+
}
125+
ans := []byte(binary)
126+
for i := range ans {
127+
ans[i] = '1'
128+
}
129+
ans[k] = '0'
130+
return string(ans)
131+
}
70132
```
71133

72134
### **...**
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public:
3+
string maximumBinaryString(string binary) {
4+
int k = binary.find('0');
5+
if (k == binary.npos) return binary;
6+
int n = binary.size();
7+
for (int i = k + 1; i < n; ++i) {
8+
if (binary[i] == '0') {
9+
++k;
10+
}
11+
}
12+
return string(k, '1') + '0' + string(n - k - 1, '1');
13+
}
14+
};
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
func maximumBinaryString(binary string) string {
2+
k := strings.IndexByte(binary, '0')
3+
if k == -1 {
4+
return binary
5+
}
6+
for _, c := range binary[k+1:] {
7+
if c == '0' {
8+
k++
9+
}
10+
}
11+
ans := []byte(binary)
12+
for i := range ans {
13+
ans[i] = '1'
14+
}
15+
ans[k] = '0'
16+
return string(ans)
17+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public String maximumBinaryString(String binary) {
3+
int k = binary.indexOf('0');
4+
if (k == -1) {
5+
return binary;
6+
}
7+
int n = binary.length();
8+
for (int i = k + 1; i < n; ++i) {
9+
if (binary.charAt(i) == '0') {
10+
++k;
11+
}
12+
}
13+
char[] ans = binary.toCharArray();
14+
Arrays.fill(ans, '1');
15+
ans[k] = '0';
16+
return String.valueOf(ans);
17+
}
18+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class Solution:
2+
def maximumBinaryString(self, binary: str) -> str:
3+
k = binary.find('0')
4+
if k == -1:
5+
return binary
6+
k += binary[k + 1 :].count('0')
7+
return '1' * k + '0' + '1' * (len(binary) - k - 1)

0 commit comments

Comments
 (0)