刷题的日常-检查二进制字符串字段

62 阅读2分钟

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

刷题的日常-2022年10月3号

一天一题,保持脑子清爽

检查二进制字符串字段

来自leetcode的 1784 题,题意如下:

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

示例1:

输入: s = "1001"
输出: false
解释: 由连续若干个 '1' 组成的字段数量为 2,返回 false

示例2:

输入: s = "110"
输出: true

理解题意

我们可以从题意中提取的条件如下:

  • 题目给出一个字符串,要求我们对其做判断
  • 如果字符串中有1,那么它们必须是连续的,不能中间插入0
  • 字符串中没有前导零,这意味着1必须在开头处,往后连续的

做题思路

因为没有前导零,所以我们可以直接从开头开始往后连续一直判断是否是1,如果是的话就继续,不是的话就停止,具体的步骤如下:

  • 开辟一个索引空间用来记录当前位置
  • 循环进行判断,第一个循环是用来判断开头1连续的数量,如果全是1,那么返回true即可
  • 如果前一个循环没能走到结尾,那就是碰见0的情况
  • 这个时候就需要判断0的个数
  • 循环判断0的个数
  • 遇到1就退出
  • 最后直接判断索引走到最后即可,因为没走到最后说明又出现了1的情况,不符合题意

代码实现

代码实现如下:

public class Solution {
    public boolean checkOnesSegment(String s) {
        int idx = 0;
        while (idx < s.length() && s.charAt(idx) == '1') {
            idx++;
        }
        if (idx == s.length()) {
            return true;
        }
        while (idx < s.length() && s.charAt(idx) == '0') {
            idx++;
        }
        return idx >= s.length();
    }
}

image.png