侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 470 篇文章
  • 累计创建 108 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

【脑筋急转弯】检查二进制字符串字段

GabrielxD
2022-10-03 / 0 评论 / 0 点赞 / 17 阅读 / 435 字 / 正在检测是否收录...

题目

1784. 检查二进制字符串字段


Given a binary string s without leading zeros, return true if s contains at most one contiguous segment of ones. Otherwise, return false.

给定一个二进制字符串 s不含前导零,如果 s 包含最多一个连续的 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'

解题

方法一:枚举

思路

题目中所说的「连续的 11 段」理解如下:

如果 s = "11001110001"
那么它有3个连续的1段 分别是: (括号括住的部分)
"(11)00(111)000(1)"

题中给出的字符串 s 不含前导零,也就是说 s 开头的一段一定是连续的 11 段,而 s 中的连续 11 段如果超过 11 个就要返回 false,所以我们直接跳过开头的一段 11,去枚举后面的字符,如果出现 11 就返回 false,如果没有就返回 true

代码

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

方法二:脑筋急转弯

思路

既然 s 不含前导零,那如果字符串中出现了 "01" 这样的子字符串,就说明连续的 11 段一定超过了一个。

代码

class Solution {
    public boolean checkOnesSegment(String s) {
        return !s.contains("01");
    }
}
0

评论区