Easy
题目描述
给定一个二进制字符串 s,如果最长连续 1 的段长度严格大于最长连续 0 的段长度,返回 true,否则返回 false。
例如,在 s = "110100010" 中,最长连续 1 的段长度为 2,最长连续 0 的段长度为 3。
注意:如果没有 0,则认为最长连续 0 的段长度为 0。同样,如果没有 1,最长连续 1 的段长度也为 0。
示例 1:
输入:s = "1101"
输出:true
解释:
最长连续 1 的段长度为 2:"1101"
最长连续 0 的段长度为 1:"1101"
1 的段更长,所以返回 true。
示例 2:
输入:s = "111000"
输出:false
解释:
最长连续 1 的段长度为 3:"111000"
最长连续 0 的段长度为 3:"111000"
1 的段不更长,所以返回 false。
示例 3:
输入:s = "110100010"
输出:false
解释:
最长连续 1 的段长度为 2:"110100010"
最长连续 0 的段长度为 3:"110100010"
1 的段不更长,所以返回 false。
约束:
1 <= s.length <= 100s[i]为 ‘0’ 或 ‘1’
解题思路
这道题要求找到字符串中最长连续 1 的段长度和最长连续 0 的段长度,然后比较两者大小。
解法一:一次遍历(推荐) 我们可以通过一次遍历来同时计算两种字符的最长连续长度。维护当前字符和当前连续长度,当字符改变时更新最大长度并重置当前长度。
解法二:分别计算 可以写一个辅助函数计算某个字符的最长连续长度,然后分别计算 ‘0’ 和 ‘1’ 的最长长度。
解法三:正则表达式 使用正则表达式找到所有连续的 0 和 1,然后比较最大长度。
第一种解法最优,时间复杂度 O(n),空间复杂度 O(1),代码简洁易懂。核心思路是用四个变量:max0、max1 记录最大长度,curr0、curr1 记录当前连续长度。遍历字符串时,如果是 ‘0’ 则 curr0++ 并重置 curr1 = 0,反之亦然。同时更新对应的最大值。
代码实现
class Solution {
public:
bool checkZeroOnes(string s) {
int max0 = 0, max1 = 0;
int curr0 = 0, curr1 = 0;
for (char c : s) {
if (c == '0') {
curr0++;
curr1 = 0;
max0 = max(max0, curr0);
} else {
curr1++;
curr0 = 0;
max1 = max(max1, curr1);
}
}
return max1 > max0;
}
};
class Solution:
def checkZeroOnes(self, s: str) -> bool:
max0 = max1 = 0
curr0 = curr1 = 0
for c in s:
if c == '0':
curr0 += 1
curr1 = 0
max0 = max(max0, curr0)
else:
curr1 += 1
curr0 = 0
max1 = max(max1, curr1)
return max1 > max0
public class Solution {
public bool CheckZeroOnes(string s) {
int max0 = 0, max1 = 0;
int curr0 = 0, curr1 = 0;
foreach (char c in s) {
if (c == '0') {
curr0++;
curr1 = 0;
max0 = Math.Max(max0, curr0);
} else {
curr1++;
curr0 = 0;
max1 = Math.Max(max1, curr1);
}
}
return max1 > max0;
}
}
var checkZeroOnes = function(s) {
let maxOnes = 0, maxZeros = 0;
let currentOnes = 0, currentZeros = 0;
for (let char of s) {
if (char === '1') {
currentOnes++;
currentZeros = 0;
maxOnes = Math.max(maxOnes, currentOnes);
} else {
currentZeros++;
currentOnes = 0;
maxZeros = Math.max(maxZeros, currentZeros);
}
}
return maxOnes > maxZeros;
};
复杂度分析
| 复杂度 | 大小 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(1) |
其中 n 是字符串的长度。我们只需要遍历一次字符串,使用常数个变量来记录状态。