Easy

题目描述

给你一个不含前导零的二进制字符串 s,如果 s 最多包含一个由连续的 1 组成的字段,返回 true​​​。否则,返回 false

示例 1:

输入:s = "1001"
输出:false
解释:字符串有两个由 1 组成的字段。

示例 2:

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

提示:

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

解题思路

这道题要求判断二进制字符串中是否最多有一个连续的1段。

思路分析:

有两种主要思路来解决这个问题:

  1. 直接计数法:遍历字符串,统计连续1段的数量。当我们从0变为1时,说明开始了一个新的1段。如果1段数量超过1,返回false。

  2. 模式匹配法:观察题目特点,如果最多只有一个连续1段,那么字符串的模式只能是以下几种:

    • 全部是1:如"111"
    • 1后面跟0:如"110"、“1100”

    换句话说,一旦出现"01"这个子串,说明在0后面又出现了1,这意味着至少有两个1段。

推荐解法:使用模式匹配法更简洁。我们只需要检查字符串中是否包含"01"子串。如果包含,说明有多个1段;否则最多只有一个1段。

由于题目保证字符串以1开头,所以我们只需要检查是否存在"01"模式即可。

代码实现

class Solution {
public:
    bool checkOnesSegment(string s) {
        return s.find("01") == string::npos;
    }
};
class Solution:
    def checkOnesSegment(self, s: str) -> bool:
        return "01" not in s
public class Solution {
    public bool CheckOnesSegment(string s) {
        return !s.Contains("01");
    }
}
var checkOnesSegment = function(s) {
    return !s.includes("01");
};

复杂度分析

复杂度类型大小
时间复杂度O(n)
空间复杂度O(1)

其中 n 为字符串长度。时间复杂度为 O(n) 是因为需要遍历字符串查找子串"01";空间复杂度为 O(1),只使用了常数级别的额外空间。

相关题目