算法小知识-----10.04----- 检查二进制字符串字段

108 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

国庆第四天了,假期进入下坡路了,很痛苦

检查二进制字符串字段

该题出自力扣的1784题 —— 检查二进制字符串字符【简单题】

审题

给你一个二进制字符串 s ,该字符串 不含前导零 。 如果 s 包含 零个或一个由连续的 '1' 组成的字段 ,返回 true 。否则,返回 false 。 如果 s 中 由连续若干个 '1' 组成的字段 数量不超过 1,返回 true 。否则,返回 false 。

  • 该题主要是对字符串的判定,字符串1和0的业务规则
  • 首先字符串的首位必定是1,两个业务规则其实说的就是一个,如果有1个或多个1的子字段,并且数量超过1个,则返回true,否则返回false
  • 判断字符串是否由左边连续的1和右边连续的0两部分组成,其他的构成都不合法。所以我们只需要找出两个端点然后判断位置就可以了。判断字符串中的所有1是否全部连在一起
  • s 包含 零个或一个由连续的 '1' 组成的字段 ,返回 true;
  • 解法:
    • 定义3个整型变量,一个变量记录出现1的字段,一个记录1的出现数量
    • 可以看到两种情况中都不包含 01 串
    • 循环字符串,判断字符串当前字符属于‘(’还是‘)’
    • 最终返回两个变量是是否满足业务规则
  • 时间复杂度:O(n),其中 n 为字符串 s 的长度。
  • 空间复杂度:O(1),仅适用常量空间。

编码

class Solution {
    public boolean checkOnesSegment(String s) {
        int num1 = 0;
        int fa1 = 0;
        int numIndex = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '1'){
                numIndex++;
            }else if (s.charAt(i) == '0' && numIndex > 0){
                num1++;
                fa1++;
                numIndex = 0;
            }
        }
        if (numIndex > 0){
            num1++;
            fa1++;
        }
        return fa1 <=1 || num1  <= 1;
    }
}

image.png