首页 > 其他分享 >[Leetcode] 0696. 计数二进制子串

[Leetcode] 0696. 计数二进制子串

时间:2023-05-05 10:24:17浏览次数:43  
标签:子串 cnt 01 00110011 0696 counts include Leetcode

696. 计数二进制子串

点击上方链接跳转至leetcode

题目描述

给定一个字符串 s,统计并返回具有相同数量 01 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是成组连续的。

重复出现(不同位置)的子串也要统计它们出现的次数。

 

示例 1:

输入:s = "00110011"
输出:6
解释:6 个子串满足具有相同数量的连续 1 和 0 :"0011"、"01"、"1100"、"10"、"0011" 和 "01" 。
注意,一些重复出现的子串(不同位置)要统计它们出现的次数。
另外,"00110011" 不是有效的子串,因为所有的 0(还有 1 )没有组合在一起。

示例 2:

输入:s = "10101"
输出:4
解释:有 4 个子串:"10"、"01"、"10"、"01" ,具有相同数量的连续 1 和 0 。

 

提示:

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

解法

我们可以将字符串 ss 按照 00 和 11 的连续段分组,存在counts数组中,例如 s = 00111011,可以得到这样的 counts 数组: counts={2,3,1,2}。
这里counts数组中两个相邻的数一定代表的是两种不同的字符。假设counts数组中两个相邻的数字为u或者v,它们对应着u个00 和 v 个 11,或者u 个 11 和v 个 00。它们能组成的满足条件的子串数目为min{u,v},即一对相邻的数字对答案的贡献。
我们只要遍历所有相邻的数对,求它们的贡献总和,即可得到答案。

Python3

from typing import List    

class Solution:
    def countBinarySubstrings(self, s: str) -> int:
        i, n = 0, len(s)
        t = []
        while i < n:
            cnt = 1
            while i + 1 < n and s[i + 1] == s[i]:
                cnt += 1
                i += 1
            t.append(cnt)
            i += 1
        ans = 0
        for i in range(1, len(t)):
            ans += min(t[i - 1], t[i])
        return ans


fun = Solution()
s = "00110011"
res = fun.countBinarySubstrings(s)
print(res)

C++

#include<iostream>
#include<string>
#include<vector>
using namespace std;

class Solution{
public:
    int countBinarySubstrings(string s) {
        int i =0,n = s.size();
        vector<int> t;
        while(i<n){
            int cnt = 1;
            while(i+1 < n && s[i+1] == s[i]){
                ++cnt;
                ++i;
            }
            t.push_back(cnt);
            ++i;
        }
        int ans = 0;
        for(i =1;i<t.size();++i)
            ans += min(t[i-1],t[i]);
        return ans;
    }
};

int main(){

    string s= "00110011";
    int res = Solution().countBinarySubstrings(s);
    cout << "res: " << res << endl;

    return  0;
}

//g++ 696.cpp -std=c++11

复杂度分析:

时间复杂度和空间复杂度都是O(n)。

标签:子串,cnt,01,00110011,0696,counts,include,Leetcode
From: https://www.cnblogs.com/yege/p/17373351.html

相关文章

  • [Leetcode] 0674. 最长连续递增序列
    674.最长连续递增序列题目描述给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。连续递增的子序列可以由两个下标l和r(l<r)确定,如果对于每个l<=i<r,都有nums[i]<nums[i+1],那么子序列[nums[l],nums[l+1],...,nums[r-1],nums[......
  • [Leetcode] 0680. 验证回文串 II
    680.验证回文串II点击上方标题跳转至leetcode题目描述给你一个字符串 s,最多可以从中删除一个字符。请你判断s是否能成为回文字符串:如果能,返回true;否则,返回false。 示例1:输入:s="aba"输出:true示例2:输入:s="abca"输出:true解释:你可以删除字符'c'。示......
  • [Leetcode] 0661. 图片平滑器
    661.图片平滑器题目描述图像平滑器是大小为 3x3的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。每个单元格的 平均灰度定义为:该单元格自身及其周围的8个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中9个单元格的平均......
  • LeetCode/简化路径
    简化unix文件路径1.分割提取+栈classSolution{public:stringsimplifyPath(stringpath){vector<string>names=split(path,'/');//消除/并得到待处理的多段文件名vector<string>stack;//这里需要使用栈来判断..的回跳for(string&na......
  • 无重复字符的最长子串
     1.设置开始的窗口长度为1,最大长度为0如果字符串的长度length本身为0返回max_length; 2.将一个字母输入到字符串temp中,如果窗口长度等于length那max_length就等于window_length; 3.判断加入下一个字符后字符串是否重复如果不重复则window_length+1,更新max_length的值和j的值;......
  • [Leetcode] 0657. 机器人能否返回原点
    657.机器人能否返回原点题目描述在二维平面上,有一个机器人从原点(0,0)开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0,0)处结束。移动顺序由字符串 moves 表示。字符move[i]表示其第i次移动。机器人的有效动作有 R(右),L(左),U(上)和D(下)。如果机器人在完......
  • [Leetcode] 0001. 两数之和
    1.两数之和题目描述给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。 示例1......
  • LeetCode 双周赛 103(2023/04/29)区间求和的树状数组经典应用
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。这场周赛是LeetCode双周赛第103场,难得在五一假期第一天打周赛的人数也没有少太多。这场比赛前3题比较简单,我们把篇幅留给最后一题。往期周赛回顾:LeetCode单周赛第342场·容......
  • LeetCode -- 递归 dfs、回溯
    22. 括号生成 classSolution{publicList<String>generateParenthesis(intn){List<String>result=newArrayList();if(n==0){returnresult;}//必须要用字符串,每次拼接要产生新对象。不能用StringBuf......
  • Leetcode1~10题整理
    1.两数之和哈希表:O(n)classSolution{public:vector<int>twoSum(vector<int>&nums,inttarget){unordered_map<int,int>hs;intn=nums.size();for(inti=0;i<n;i++){intx=target-n......