|
53 | 53 |
|
54 | 54 | <!-- 这里可写通用的实现逻辑 -->
|
55 | 55 |
|
| 56 | +**方法一:暴力枚举** |
| 57 | + |
| 58 | +注意到数据范围很小,因此,我们可以枚举所有的子串 $s[i..j]$,检查其是否为平衡子串,如果是,则更新答案。 |
| 59 | + |
| 60 | +时间复杂度 $O(n^3)$,空间复杂度 $O(1)$。其中 $n$ 为字符串 $s$ 的长度。 |
| 61 | + |
| 62 | +**方法二:枚举优化** |
| 63 | + |
| 64 | +我们用变量 $zero$ 和 $one$ 分别记录当前连续的 $0$ 和 $1$ 的个数。 |
| 65 | + |
| 66 | +遍历字符串 $s$,对于当前字符 $c$: |
| 67 | + |
| 68 | +- 如果当前字符为 `'0'`,我们判断此时 $one$ 是否大于 $0$,是则将 $zero$ 和 $one$ 重置为 $0$,接下来将 $zero$ 加 $1$。 |
| 69 | +- 如果当前字符为 `'1'`,则将 $one$ 加 $1$,并更新答案为 $2 \times min(one, zero)$。 |
| 70 | + |
| 71 | +遍历结束后,即可得到最长的平衡子串的长度。 |
| 72 | + |
| 73 | +时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为字符串 $s$ 的长度。 |
| 74 | + |
56 | 75 | <!-- tabs:start -->
|
57 | 76 |
|
58 | 77 | ### **Python3**
|
@@ -80,6 +99,21 @@ class Solution:
|
80 | 99 | return ans
|
81 | 100 | ```
|
82 | 101 |
|
| 102 | +```python |
| 103 | +class Solution: |
| 104 | + def findTheLongestBalancedSubstring(self, s: str) -> int: |
| 105 | + ans = zero = one = 0 |
| 106 | + for c in s: |
| 107 | + if c == '0': |
| 108 | + if one: |
| 109 | + zero = one = 0 |
| 110 | + zero += 1 |
| 111 | + else: |
| 112 | + one += 1 |
| 113 | + ans = max(ans, 2 * min(one, zero)) |
| 114 | + return ans |
| 115 | +``` |
| 116 | + |
83 | 117 | ### **Java**
|
84 | 118 |
|
85 | 119 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
@@ -113,6 +147,27 @@ class Solution {
|
113 | 147 | }
|
114 | 148 | ```
|
115 | 149 |
|
| 150 | +```java |
| 151 | +class Solution { |
| 152 | + public int findTheLongestBalancedSubstring(String s) { |
| 153 | + int zero = 0, one = 0; |
| 154 | + int ans = 0, n = s.length(); |
| 155 | + for (int i = 0; i < n; ++i) { |
| 156 | + if (s.charAt(i) == '0') { |
| 157 | + if (one > 0) { |
| 158 | + zero = 0; |
| 159 | + one = 0; |
| 160 | + } |
| 161 | + ++zero; |
| 162 | + } else { |
| 163 | + ans = Math.max(ans, 2 * Math.min(zero, ++one)); |
| 164 | + } |
| 165 | + } |
| 166 | + return ans; |
| 167 | + } |
| 168 | +} |
| 169 | +``` |
| 170 | + |
116 | 171 | ### **C++**
|
117 | 172 |
|
118 | 173 | ```cpp
|
@@ -144,6 +199,28 @@ public:
|
144 | 199 | };
|
145 | 200 | ```
|
146 | 201 |
|
| 202 | +```cpp |
| 203 | +class Solution { |
| 204 | +public: |
| 205 | + int findTheLongestBalancedSubstring(string s) { |
| 206 | + int zero = 0, one = 0; |
| 207 | + int ans = 0, n = s.size(); |
| 208 | + for (char& c : s) { |
| 209 | + if (c == '0') { |
| 210 | + if (one > 0) { |
| 211 | + zero = 0; |
| 212 | + one = 0; |
| 213 | + } |
| 214 | + ++zero; |
| 215 | + } else { |
| 216 | + ans = max(ans, 2 * min(zero, ++one)); |
| 217 | + } |
| 218 | + } |
| 219 | + return ans; |
| 220 | + } |
| 221 | +}; |
| 222 | +``` |
| 223 | + |
147 | 224 | ### **Go**
|
148 | 225 |
|
149 | 226 | ```go
|
@@ -178,6 +255,38 @@ func max(a, b int) int {
|
178 | 255 | }
|
179 | 256 | ```
|
180 | 257 |
|
| 258 | +```go |
| 259 | +func findTheLongestBalancedSubstring(s string) (ans int) { |
| 260 | + zero, one := 0, 0 |
| 261 | + for _, c := range s { |
| 262 | + if c == '0' { |
| 263 | + if one > 0 { |
| 264 | + zero, one = 0, 0 |
| 265 | + } |
| 266 | + zero++ |
| 267 | + } else { |
| 268 | + one++ |
| 269 | + ans = max(ans, 2*min(zero, one)) |
| 270 | + } |
| 271 | + } |
| 272 | + return |
| 273 | +} |
| 274 | + |
| 275 | +func max(a, b int) int { |
| 276 | + if a > b { |
| 277 | + return a |
| 278 | + } |
| 279 | + return b |
| 280 | +} |
| 281 | + |
| 282 | +func min(a, b int) int { |
| 283 | + if a < b { |
| 284 | + return a |
| 285 | + } |
| 286 | + return b |
| 287 | +} |
| 288 | +``` |
| 289 | + |
181 | 290 | ### **...**
|
182 | 291 |
|
183 | 292 | ```
|
|
0 commit comments