检查二进制字符串字段

标签: 字符串

难度: Easy

给你一个二进制字符串 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'

Submission

运行时间: 24 ms

内存: 16.6 MB

class Solution:
    def checkOnesSegment(self, s: str) -> bool:
        #初始化变量
        num0=0           
        num1=0
        length0=1
        length1=1     
        # 遍历字符串
        for i in s:
            # 判断字符是1
            if (i=="1"):
                #字符1的连续长度变量加1
                    length1+=1
                    #判断字符0的连续长度变量是否为0,如果不为0,将它变为0。因为当前的字符是1
                    if (length0!=0):
                        #将最大值和当前的连续长度变量中的更大值赋给max0变量
                        num1 += 1
                        length0 = 0
            # 判断字符是0        
            elif (i=="0"):
                #字符0的连续长度变量加1
                    length0+=1
                    #判断字符1的连续长度变量是否为0,如果不为0,将它变为0.因为当前的字符是0
                    if (length1!=0):
                        #将最大值和当前的连续长度变量中的更大值赋给max1变量
                        num0 += 1                   
                        length1 = 0 
        if num1>1:
            return False
        else:
            return True
          

Explain

这个题解的基本思路是通过遍历给定的二进制字符串 `s`,并统计其中连续'1'的段数。解决方案中定义了几个变量来跟踪连续的'0'和'1'的长度以及它们的段数。核心思想是在遍历字符串的过程中,每当我们从'1'切换到'0'或从'0'切换到'1'时,相应的段数(num0或num1)会增加,并且连续长度(length0或length1)会重置。最后,如果连续的'1'段数(num1)超过1,则返回false,否则返回true。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def checkOnesSegment(self, s: str) -> bool:
        # 初始化段数和连续长度计数器
        num0 = 0
        num1 = 0
        length0 = 1
        length1 = 1
        # 遍历字符串中的每个字符
        for i in s:
            if (i == '1'):
                # 当当前字符为'1'时,增加连续'1'的长度
                length1 += 1
                if (length0 != 0):
                    # 如果之前连续的是'0',增加连续'1'段的计数
                    num1 += 1
                    length0 = 0
            elif (i == '0'):
                # 当当前字符为'0',增加连续'0'的长度
                length0 += 1
                if (length1 != 0):
                    # 如果之前连续的是'1',增加连续'0'段的计数
                    num0 += 1
                    length1 = 0
        # 最终,如果连续'1'段数超过1,则返回False
        if num1 > 1:
            return False
        else:
            return True

Explore

在题解中,num0和num1从0开始,是为了在遍历过程中正确统计段数。具体来说,如果字符串的第一个字符是'1',则在遇到第一个'1'时由于length0是1,num1不会立即增加。只有在从'0'切换到'1'的情况下,num1才会增加,确保只在真正的切换发生时才统计新的段数。这种初始化方式避免了对开始字符的特殊处理,简化了代码逻辑。

实际上,length0和length1初始化为1是一个错误。这种初始化会导致即便字符串s中实际上没有'0'或'1',长度也会从1开始计数,这明显是不正确的。正确的做法应该是初始化length0和length1为0,只有在遇到相应字符时才开始从1计数,这样可以更准确地反映连续'0'或'1'的实际长度。

题解中未显式处理字符串末尾的连续段。例如,如果字符串以'1'结束,并且在此之前有一个或多个'0',则应该在遍历结束时检查最后一个字符,并相应地增加连续段数。当前题解的逻辑可能无法正确处理这种情况,因此最好在循环结束后添加逻辑来处理字符串最后一个字符,以确保连续段被正确计算。

这两种思路实际上是类似的,但在从'0'切换到'1'时增加num1可以更简单地处理段的起始条件。如果在每次遇到'1'时检查前一个字符是否是'0',这需要额外的逻辑来处理当前字符的前一个状态,而在从'0'切换到'1'时增加num1则直接利用了当前的遍历逻辑,可以减少条件判断,使代码更简洁。