1079. 连续子串计数(经典)

1079. 连续子串计数

中文English

给定字符串s,计算有相同数量的0和1的非空连续子串的数量,并且子串中所有的0和所有的1都是连续的。

相同的子串出现多次则计数多次。

样例

样例 1:

输入: "00110011"
输出: 6
解释: 有6个符合题目的连续子串:"0011", "01", "1100", "10", "0011", and "01".

注意重复的子串会记录多次。

而且, "00110011" 是不合理的子串,因为所有的0和1没有连在一起。

样例 2:

输入: "10101"
输出: 4
解释: 有4个合题的连续子串: "10", "01", "10", "01"。

注意事项

s.length的范围为1到50000。
s仅由0和1组成。

 
 
输入测试数据 (每行一个参数)如何理解测试数据?

 

class Solution:
    """
    @param s: a string
    @return: the number of substrings
    """
    '''
    大致思路:
    1.初始化count = 0,初始化left_count,right_count = None,None,  p = None,循环,如果遇到p不同的,则开始计数(right_count),相同的也开始计数(left_count)
    2.然后取出[left_count,right_count]最小值,得到的值就是连续的全部子串次数,count += min[left_count,right_count],最后返回count即可
    '''
    def countBinarySubstrings(self,s):
        count = 0
        left_count,right_count = None,None
        p = s[0]
        index = 1
        flag = 'left'

        ##循环
        s = s + ' '
        for i in range(1,len(s)):
            if s[i]  != p:
                ##只进来一次,第一次的时候,需要left_count,right_count,之后就不需要了,因为left_count会被赋值right_count
                if flag == 'left':
                    left_count = index
                    flag = 'right'
                    index = 0
                    p = s[i]

                ##后面过来一直都是right,第一次来是left
                elif flag == 'right':
                    print('right:',i)
                    right_count = index
                    
                    #如果是right的时候,需要进行取出最小值
                    count += min([left_count,right_count])
                    index = 0
                    left_count = right_count
                    p = s[i]
            index += 1
        return count

 

简化版本:

默认第一次left_count初始值为0,之后根据right_count进行赋值

class Solution:
    """
    @param s: a string
    @return: the number of substrings
    """
    '''
    大致思路:
    1.初始化count = 0,初始化left_count,right_count = None,None,  p = None,循环,如果遇到p不同的,则开始计数(right_count),相同的也开始计数(left_count)
    2.然后取出[left_count,right_count]最小值,得到的值就是连续的全部子串次数,count += min[left_count,right_count],最后返回count即可
    '''
    def countBinarySubstrings(self,s):
        count = 0
        left_count,right_count = 0,0
        p = s[0]
        index = 1

        ##循环
        s = s + ' '
        for i in range(1,len(s)):
            if s[i]  != p:
                #当第一次进来的时候left_count是0,之后就一直会有值了,left_count = right_count会被赋值
                right_count = index
                
                #如果是right的时候,需要进行取出最小值
                count += min([left_count,right_count])
                index = 0
                left_count = right_count
                p = s[i]
            index += 1
        return count

 

最简写法:

class Solution:
    def countBinarySubstrings(self,s):
        c = 0
        l,r = 0,0
        p = s[0]
        z = 1

        s = s + ' '
        for i in range(1,len(s)):
            if s[i]  != p:
                r = z 
                c += min([l,r])
                z = 0
                l = r
                p = s[i]
            z += 1
        return c

 

posted @ 2020-04-06 17:27  风不再来  阅读(529)  评论(0编辑  收藏  举报