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 =  (x :  string ):  number  =>  {
164+  let  [mx, cnt] =  [0 , 0 ];
165+  for  (const 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