【Java算法刷题 20-1】思路+注释 leetcode:1784. 检查二进制字符串字段

92 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情


题目、1784. 检查二进制字符串字段

原题链接:1784. 检查二进制字符串字段

题目描述

给你一个二进制字符串 s ,该字符串 不含前导零

如果s 包含 零个或一个由连续的 '1'组成的字段 ,返回 true​​​ 。否则,返回 false

如果 s由连续若干个 '1' 组成的字段 数量不超过 1,返回 true​​​ 。否则,返回 false

/

示例 1:

输入:s = "1001"

输出:false

解释:由连续若干个 '1' 组成的字段数量为 2,返回 false

/

示例 2:

输入:s = "110"

输出:true

解题思路

根据题目的要求,我们可以首先将比较特别的情况给处理掉: 当二进制字符串s全部由’1‘或全部由’0‘组成,都满足要求,可以直接返回true。

接下来就是比较棘手的问题了,我们需要确定,字符串中包含一个由连续的 '1'组成的字段,这里面的难点就是,连续若干个 '1' 组成的字段 数量不可以超过 1

为了得到二进制字符串s中,由连续若干个 '1' 组成的字段的数量,我们需要使用滑动窗口的思想,同时还需要获取字符串中字符’1‘的个数来充当辅助。

为什么要这么做呢....我们来讲述一下规律吧:

使用一个长度为2的滑动窗口来遍历字符串,当滑动窗口中的字符串为“11”的时候,就记录下来: 滑动窗口“11”出现的总数用pair表示;

我们还需要遍历字符串的每个字符,记录当中字符’1‘出现的次数: 二进制字符串中“1”的总数,用n来表示;

由连续若干个 '1' 组成的字段的数量等于1时:n - pair = 1; 由连续若干个 '1' 组成的字段的数量等于2时:n - pair = 2; 由连续若干个 '1' 组成的字段的数量等于3时:n - pair = 3; ....... 由连续若干个 '1' 组成的字段的数量等于k时:n - pair = k;

遍历完二进制字符串 s , 只有n - pair = 1时,我们返回true

提交代码

class Solution {
    public boolean checkOnesSegment(String s) {
        //如果字符串中不出现‘1’或不出现‘0’,返回true
        //因为字符串包含 零个或一个由连续的 '1' 组成的字段
        //且由连续若干个 '1' 组成的字段 数量不超过 1
        if(!s.contains("1") || !s.contains("0")) return true;

        //获取二进制字段的长度
        int n = s.length();
        //记录由连续的 '1' 组成的字段 的数量
        int sum = 0;

        for(int i = 0;i < n;++i){  //遍历二进制字段
            char a = s.charAt(i);  
            if(a == '1')           //遍历到'1'
            ++sum;                 //记录其出现的次数
            if(i+1 < n){           //若长度为2的滑动窗口中是"11",
                if(a == '1' && s.charAt(i+1) == '1')
                --sum;             //记录-1
            }
        }
        //由连续若干个 '1' 组成的字段 数量为 1,返回true,否则返回false
        return sum == 1;          
        
    }
}

提交结果

执行速度击败百分百,哈哈。 在这里插入图片描述