6262
6363<!-- 这里可写通用的实现逻辑 -->
6464
65- 直接遍历字符串,获取"0 子串"和"1 子串"的最大长度 ` len0 ` 、 ` len1 ` 。
65+ ** 方法一:两次遍历 **
6666
67- 遍历结束后,若 ` len1 > len0 ` ,返回 true,否则返回 false。
67+ 我们设计一个函数 $f(x),ドル表示字符串 $s$ 中由 $x$ 组成的最长连续子字符串的长度。如果 $f(1) \gt f(0),ドル那么返回 ` true ` ,否则返回 ` false ` 。
68+ 69+ 时间复杂度 $O(n),ドル其中 $n$ 是字符串 $s$ 的长度。空间复杂度 $O(1)$。
6870
6971<!-- tabs:start -->
7072
7577``` python
7678class Solution :
7779 def checkZeroOnes (self , s : str ) -> bool :
78- n0 = n1 = 0
79- t0 = t1 = 0
80- for c in s:
81- if c == ' 0' :
82- t0 += 1
83- t1 = 0
84- else :
85- t0 = 0
86- t1 += 1
87- n0 = max (n0, t0)
88- n1 = max (n1, t1)
89- return n1 > n0
80+ def f (x : str ) -> int :
81+ cnt = mx = 0
82+ for c in s:
83+ if c == x:
84+ cnt += 1
85+ mx = max (mx, cnt)
86+ else :
87+ cnt = 0
88+ return mx
89+ 90+ return f(" 1" ) > f(" 0" )
9091```
9192
9293### ** Java**
@@ -96,71 +97,41 @@ class Solution:
9697``` java
9798class Solution {
9899 public boolean checkZeroOnes (String s ) {
99- int n0 = 0 , n1 = 0 ;
100- int t0 = 0 , t1 = 0 ;
100+ return f(s, ' 1' ) > f(s, ' 0' );
101+ }
102+ 103+ private int f (String s , char x ) {
104+ int cnt = 0 , mx = 0 ;
101105 for (int i = 0 ; i < s. length(); ++ i) {
102- if (s. charAt(i) == ' 0' ) {
103- ++ t0;
104- t1 = 0 ;
106+ if (s. charAt(i) == x) {
107+ mx = Math . max(mx, ++ cnt);
105108 } else {
106- ++ t1;
107- t0 = 0 ;
109+ cnt = 0 ;
108110 }
109- n0 = Math . max(n0, t0);
110- n1 = Math . max(n1, t1);
111111 }
112- return n1 > n0 ;
112+ return mx ;
113113 }
114114}
115115```
116116
117- ### ** JavaScript**
118- 119- ``` js
120- /**
121- * @param {string} s
122- * @return {boolean}
123- */
124- var checkZeroOnes = function (s ) {
125- let max0 = 0 ,
126- max1 = 0 ;
127- let t0 = 0 ,
128- t1 = 0 ;
129- for (let char of s) {
130- if (char == ' 0' ) {
131- t0++ ;
132- t1 = 0 ;
133- } else {
134- t1++ ;
135- t0 = 0 ;
136- }
137- max0 = Math .max (max0, t0);
138- max1 = Math .max (max1, t1);
139- }
140- return max1 > max0;
141- };
142- ```
143- 144117### ** C++**
145118
146119``` cpp
147120class Solution {
148121public:
149122 bool checkZeroOnes(string s) {
150- int n0 = 0, n1 = 0;
151- int t0 = 0, t1 = 0;
152- for (auto c : s) {
153- if (c == '0') {
154- ++t0;
155- t1 = 0;
156- } else {
157- ++t1;
158- t0 = 0;
123+ auto f = [ &] (char x) {
124+ int cnt = 0, mx = 0;
125+ for (char& c : s) {
126+ if (c == x) {
127+ mx = max(mx, ++cnt);
128+ } else {
129+ cnt = 0;
130+ }
159131 }
160- n0 = max(n0, t0);
161- n1 = max(n1, t1);
162- }
163- return n1 > n0;
132+ return mx;
133+ };
134+ return f('1') > f('0');
164135 }
165136};
166137```
@@ -169,23 +140,64 @@ public:
169140
170141```go
171142func checkZeroOnes(s string) bool {
172- n0, n1 := 0, 0
173- t0, t1 := 0, 0
174- for _, c := range s {
175- if c == '0' {
176- t0 ++
177- t1 = 0
178- } else {
179- t1++
180- t0 = 0
143+ f := func(x rune) int {
144+ cnt, mx := 0, 0
145+ for _, c := range s {
146+ if c == x {
147+ cnt ++
148+ mx = max(mx, cnt)
149+ } else {
150+ cnt = 0
151+ }
181152 }
182- n0 = max(n0, t0)
183- n1 = max(n1, t1)
153+ return mx
184154 }
185- return n1 > n0
155+ return f('1') > f('0')
186156}
187157```
188158
159+ ### ** TypeScript**
160+ 161+ ``` ts
162+ function checkZeroOnes(s : string ): boolean {
163+ const f = (x : string ): number => {
164+ let [mx, cnt] = [0 , 0 ];
165+ for (const c of s ) {
166+ if (c === x ) {
167+ mx = Math .max (mx , ++ cnt );
168+ } else {
169+ cnt = 0 ;
170+ }
171+ }
172+ return mx ;
173+ };
174+ return f (' 1' ) > f (' 0' );
175+ }
176+ ```
177+ 178+ ### ** JavaScript**
179+ 180+ ``` js
181+ /**
182+ * @param {string} s
183+ * @return {boolean}
184+ */
185+ var checkZeroOnes = function (s ) {
186+ const f = x => {
187+ let [mx, cnt] = [0 , 0 ];
188+ for (const c of s) {
189+ if (c === x) {
190+ mx = Math .max (mx, ++ cnt);
191+ } else {
192+ cnt = 0 ;
193+ }
194+ }
195+ return mx;
196+ };
197+ return f (' 1' ) > f (' 0' );
198+ };
199+ ```
200+ 189201### ** ...**
190202
191203```
0 commit comments