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 <= 100
  • s[i] 为 ‘0’ 或 ‘1’

解题思路

这道题要求找到字符串中最长连续 1 的段长度和最长连续 0 的段长度,然后比较两者大小。

解法一:一次遍历(推荐) 我们可以通过一次遍历来同时计算两种字符的最长连续长度。维护当前字符和当前连续长度,当字符改变时更新最大长度并重置当前长度。

解法二:分别计算 可以写一个辅助函数计算某个字符的最长连续长度,然后分别计算 ‘0’ 和 ‘1’ 的最长长度。

解法三:正则表达式 使用正则表达式找到所有连续的 0 和 1,然后比较最大长度。

第一种解法最优,时间复杂度 O(n),空间复杂度 O(1),代码简洁易懂。核心思路是用四个变量:max0max1 记录最大长度,curr0curr1 记录当前连续长度。遍历字符串时,如果是 ‘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 是字符串的长度。我们只需要遍历一次字符串,使用常数个变量来记录状态。

相关题目