leetcode刷题记录-1784. 检查二进制字符串字段

77 阅读2分钟

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

前言

今天的题目为简单,题目的意思可能会比较难理解,但是只要理解清楚了,就会发现题目十分的简单。

每日一题

今天的题目是 1784. 检查二进制字符串字段,难度为简单

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

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

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

 

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= s.length <= 100
  • s[i]​​​​ 为 '0' 或 '1'
  • s[0] 为 '1'

题解

模拟

题目的意思可以简单理解为几个要求,首先字符串不存在前导0,也就是字符串只会是由1开头,并且,第二句中的 s 包含 零个或一个由连续的 '1' 组成的字段,由于字符串只能由1开头,那就是必须有一个 连续的 '1' 组成的字段,至于什么时候有两个,那就是在开头的 '1' 之后出现了 '0' 之后又再次出现了 '1'。也就是 '0' 字符之后不能够出现 '1'。那么很简单,根据这一点,我们就能够做出这道题。

indexOf

根据上面的分析得出需要的证明之后,第一种解法就是通过判断字符串当中是否存在 '01' 这种字符串,因为字符串由 '1' 开头,想要出现两串不相连接的 '1' ,那最少中间需要插上几个 '0' 那么从 '0' 到 '1' 就一定会出现 '01' 这种字符组合。

当然,includes 也可以用来实现。

function checkOnesSegment(s: string): boolean {
    return !s.includes('01')
};

image.png

暴力循环模拟

还有就是按照上面的说法,一旦出现了 '0' 以后就不能够在出现 '1' 那么我们就可以利用这个去循环判断,当出现了 '0' 过后添加一个标记,如果再次出现了 '1' 就可以返回false,不然到最后就是返回 true。

function checkOnesSegment(s: string): boolean {
  let l = false
  for (let i = 1; i < s.length; i++) {
    if (l && s[i] === '1') {
      return false
    }
    if (s[i] === '0') l = true
  }
  return true
};

image.png