Easy
题目描述
给你一个不含前导零的二进制字符串 s,如果 s 最多包含一个由连续的 1 组成的字段,返回 true。否则,返回 false 。
示例 1:
输入:s = "1001"
输出:false
解释:字符串有两个由 1 组成的字段。
示例 2:
输入:s = "110"
输出:true
提示:
1 <= s.length <= 100s[i]为'0'或'1's[0]为'1'
解题思路
这道题要求判断二进制字符串中是否最多有一个连续的1段。
思路分析:
有两种主要思路来解决这个问题:
直接计数法:遍历字符串,统计连续1段的数量。当我们从0变为1时,说明开始了一个新的1段。如果1段数量超过1,返回false。
模式匹配法:观察题目特点,如果最多只有一个连续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),只使用了常数级别的额外空间。