题目描述
给你一个二进制字符串 s
。如果字符串中由 1
组成的 最长 连续子字符串 严格长于 由 0
组成的 最长 连续子字符串,返回 true
;否则,返回 false
。
- 例如,
s = "110100010"
中,由 1
组成的最长连续子字符串的长度是 2
,由 0
组成的最长连续子字符串的长度是 3
。
注意,如果字符串中不存在 0
,此时认为由 0
组成的最长连续子字符串的长度是 0
。字符串中不存在 1
的情况也适用此规则。
示例 1:
输入:s = "1101"
输出:true
解释:
由 1 组成的最长连续子字符串的长度是 2:"1101"
由 0 组成的最长连续子字符串的长度是 1:"1101"
由 1 组成的子字符串更长,故返回 true 。
示例 2:
输入:s = "111000"
输出:false
解释:
由 1 组成的最长连续子字符串的长度是 3:"111000"
由 0 组成的最长连续子字符串的长度是 3:"111000"
由 1 组成的子字符串不比由 0 组成的子字符串长,故返回 false 。
示例 3:
输入:s = "110100010"
输出:false
解释:
由 1 组成的最长连续子字符串的长度是 2:"110100010"
由 0 组成的最长连续子字符串的长度是 3:"110100010"
由 1 组成的子字符串不比由 0 组成的子字符串长,故返回 false 。
提示:
1 <= s.length <= 100
s[i]
不是 '0'
就是 '1'
解法
方法一:两次遍历
我们设计一个函数 $f(x)$,表示字符串 $s$ 中由 $x$ 组成的最长连续子字符串的长度。如果 $f(1) \gt f(0)$,那么返回 true
,否则返回 false
。
时间复杂度 $O(n)$,其中 $n$ 是字符串 $s$ 的长度。空间复杂度 $O(1)$。
1
2
3
4
5
6
7
8
9
10
11
12
13 | class Solution:
def checkZeroOnes(self, s: str) -> bool:
def f(x: str) -> int:
cnt = mx = 0
for c in s:
if c == x:
cnt += 1
mx = max(mx, cnt)
else:
cnt = 0
return mx
return f("1") > f("0")
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | class Solution {
public boolean checkZeroOnes(String s) {
return f(s, '1') > f(s, '0');
}
private int f(String s, char x) {
int cnt = 0, mx = 0;
for (int i = 0; i < s.length(); ++i) {
if (s.charAt(i) == x) {
mx = Math.max(mx, ++cnt);
} else {
cnt = 0;
}
}
return mx;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | class Solution {
public:
bool checkZeroOnes(string s) {
auto f = [&](char x) {
int cnt = 0, mx = 0;
for (char& c : s) {
if (c == x) {
mx = max(mx, ++cnt);
} else {
cnt = 0;
}
}
return mx;
};
return f('1') > f('0');
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | func checkZeroOnes(s string) bool {
f := func(x rune) int {
cnt, mx := 0, 0
for _, c := range s {
if c == x {
cnt++
mx = max(mx, cnt)
} else {
cnt = 0
}
}
return mx
}
return f('1') > f('0')
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | function checkZeroOnes(s: string): boolean {
const f = (x: string): number => {
let [mx, cnt] = [0, 0];
for (const c of s) {
if (c === x) {
mx = Math.max(mx, ++cnt);
} else {
cnt = 0;
}
}
return mx;
};
return f('1') > f('0');
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | /**
* @param {string} s
* @return {boolean}
*/
var checkZeroOnes = function (s) {
const f = x => {
let [mx, cnt] = [0, 0];
for (const c of s) {
if (c === x) {
mx = Math.max(mx, ++cnt);
} else {
cnt = 0;
}
}
return mx;
};
return f('1') > f('0');
};
|