• 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

  • 相关阅读:
    ThreeJS中文字体乱码问题
    ThreeJS简介
    Sentence-Transformer的使用及fine-tune教程
    NLP(三十三):sentence-transformers句子相似度官方示例
    NLP实践——基于SBERT的语义搜索,语义相似度计算,SimCSE、GenQ等无监督训练(非常重要)
    NLP(十一):sentence_BERT
    Python读取Word文档段落或者表格
    2019寒假作业1 打印沙漏
    错误了。不知道怎么删除博文
    python PaddleOCR安装方法
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/12643022.html
Copyright © 2020-2023  润新知