[Leetcode][第696题][JAVA][计算二进制子串][分组]

【问题描述】[简单]

在这里插入图片描述

【解答思路】

1. 按字符分组

将字符串 ss 按照 00 和 11 的连续段分组,存在counts 数组中,例如 s = 00111011,可以得到这样的counts 数组:counts={2,3,1,2}

这里counts 数组中两个相邻的数一定代表的是两种不同的字符。假设 counts 数组中两个相邻的数字为 u 或者 v,它们对应着 u 个 0 和 v 个 1,或者 u 个 1 和 v 个 0。它们能组成的满足条件的子串数目为 min{u,v},即一对相邻的数字对答案的贡献。

我们只要遍历所有相邻的数对,求它们的贡献总和,即可得到答案。

时间复杂度:O(N) 空间复杂度:O(N)

class Solution {public int countBinarySubstrings(String s) {List<Integer> counts = new ArrayList<Integer>();int ptr = 0, n = s.length();while (ptr < n) {char c = s.charAt(ptr);int count = 0;while (ptr < n && s.charAt(ptr) == c) {++ptr;++count;}counts.add(count);}int ans = 0;for (int i = 1; i < counts.size(); ++i) {ans += Math.min(counts.get(i), counts.get(i - 1));}return ans;}
}

对于某一个位置 i,其实我们只关心 i - 1位置的counts 值是多少,所以可以用一个 last 变量来维护当前位置的前一个位置,这样可以省去一个 counts 数组的空间。

时间复杂度:O(N) 空间复杂度:O(1)

class Solution {public int countBinarySubstrings(String s) {int ptr = 0, n = s.length(), last = 0, ans = 0;while (ptr < n) {char c = s.charAt(ptr);int count = 0;while (ptr < n && s.charAt(ptr) == c) {++ptr;++count;}ans += Math.min(count, last);last = count;}return ans;}
}
2. 遍历 数前面个数大于后面个数的子串

定义两个变量preLen和curLen,分别表示前面连续字符串中字符的个数,现在连续字符串中字符的个数。
当前字符和上一个字符相等时curLen++,不相等时preLen=curLen,然后curLen设为1。
如果preLen>=curLen,那么结果+1。
例如0011,应该输出为2。
1.curLen=1,preLen=0,ret=0;
2.curLen=2,preLen=0,ret=0;
3.curLen=1,preLen=2,ret=1;//001中的01
4.curLen=2,preLen=2,ret=2;//0011中的0011

class Solution {public int countBinarySubstrings(String s) {int preLen=0,curLen=1,ret=0;for(int i=1;i<s.length();i++){if(s.charAt(i-1)==s.charAt(i)) curLen++;else{preLen=curLen;curLen=1;}if(preLen>=curLen) ret++;}return ret;}
}

【总结】

1. 字符串数数题目 分类数找规律是一种思路
2.这题简单题难在思路
3.

转载链接:https://leetcode-cn.com/problems/count-binary-substrings/solution/ji-shu-er-jin-zhi-zi-chuan-by-leetcode-solution/

参考链接:https://leetcode-cn.com/problems/count-binary-substrings/solution/yi-ge-bi-jiao-qiao-miao-de-ban-fa-by-uygn9i8c6n/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第五章数理统计--样本和抽样分布

从今天开始要学习数理统计。 概率论&#xff1a;是专门研究随机现象的一门学科&#xff0c;定量描述随机现象及其规律。 数理统计&#xff1a;数理统计的研究对象是数据&#xff0c;包括对数据的采集、整理、分析、建模。主要任务是获取样本、描述样本&#xff0c;从样本得到…

Scrapy安装报错

python3 pip 安装Scrapy在win10 安装报错error: Microsoft Visual C 14.0 is required. Get it with "Microsoft Visual C Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools 问题描述 当前环境win10&#xff0c;python_3.6.1&#xff0c;64…

第四十三期:2020年企业面临的20大数据安全风险

为了帮助企业为日益增长的确定性风险做好准备&#xff0c;以下我们总结了企业2020年可能面临的20种数据安全风险。 如今&#xff0c;数据安全已成为公司、消费者和监管机构的头等大事。 近年来数据泄露和隐私事故越来越普遍&#xff0c;而且代价高昂。Risk Based Security的一…

[Leetcode][第93题][JAVA][复原IP地址][剪枝][回溯]

【问题描述】[中等] 【解答思路】 1. 递归 回溯剪枝 复杂度 class Solution {static final int SEG_COUNT 4;List<String> ans new ArrayList<String>();int[] segments new int[SEG_COUNT];public List<String> restoreIpAddresses(String s) {segmen…

函数嵌套

目录 一、函数的嵌套定义二、函数的嵌套调用一、函数的嵌套定义 函数内部定义的函数&#xff0c;无法在函数外部使用内部定义的函数。 def f1():def f2():print(from f2)f2()f2() # NameError: name f2 is not defined def f1():def f2():print(from f2)f2()f1() from f2 现在…

第六章 参数估计

依据样本推出总体分布的参数&#xff0c;方法有两种&#xff1a;矩估计和极大似然估计。  参数估计的形式有&#xff1a;点估计和区间估计。  点估计&#xff1a;构造合适的统计量θˆθˆ(X1,X2,...Xn)用来估计未知参数θ&#xff0c;θˆ称为参数θ的点估计量。  当给定…

第四十四期:1.3万亿条数据查询如何做到毫秒级响应?

知乎&#xff0c;在古典中文中意为“你知道吗?”&#xff0c;它是中国的 Quora&#xff0c;一个问答网站&#xff0c;其中各种问题由用户社区创建&#xff0c;回答&#xff0c;编辑和组织。 图片来自 Pexels 作为中国最大的知识共享平台&#xff0c;我们目前拥有 2.2 亿注册用…

Python拷贝梳理

python中存在与其他语言不同的概念&#xff0c;现在梳理一下相关概念。 其中 变量&#xff1a;拥有指向对象的连接空间&#xff0c;即引用空间的代称。 引用&#xff1a;指变量指向对象的指针。 对象&#xff1a;指变量声明后所产生的内存空间。 可变对象&#xff1a;表示…

sql一对多查询

子查询返回的值不止一个。当子查询跟随在 、!、<、<、>、> 之后&#xff0c;或子查询用作表达式时&#xff0c;这种情况是不允许的。 正确写法&#xff1a; select Material_Manage.MaterialNum,Material_Manage.MaterialName,Material_Manage.MaterialWeight,Mate…

[Leetcode][第130题][JAVA][被围绕的区域][DFS][BFS]

【问题描述】[中等] 【解答思路】 1. 深度优先搜索 使用深度优先搜索实现标记操作。在下面的代码中&#xff0c;我们把标记过的字母 O 修改为字母 A。 复杂度 class Solution {int[] dx {1, -1, 0, 0};int[] dy {0, 0, 1, -1};public void solve(char[][] board) {int n …

第四十五期:程序员未来干什么?做架构还是做管理?

很多程序员应该都会有这个疑问&#xff0c;尤其是工作经验不多的&#xff0c;对未来充满了期待。在我职业生涯的早期&#xff0c;比较偏重于走管理路线&#xff1b;现在呢&#xff0c;成了公司的架构师&#xff0c;当然也会承担一部分的管理工作。 很多程序员应该都会有这个疑问…

leetcode之回溯backtracing专题1

39 Combination Sum 给一组整数&#xff0c;给一个目标整数。从数组中任意选择几个数&#xff0c;这几个数的和等于目标整数。数组中每个数字可以选择多次。  例如given candidate set [2, 3, 6, 7] and target 7, 返回 [ [7], [2, 2, 3] ] 思路&#xff1a;数组candidat…

第十九期:HTTPS虐我千百遍,我却待她如初恋!

本篇将讨论 HTTPS 的加解密原理&#xff0c;很多人都知道 RSA&#xff0c;以为 HTTPSRSA&#xff0c;使用 RSA 加解密数据&#xff0c;实际上这是不对的。 图片来自 Pexels HTTPS 是使用 RSA 进行身份验证和交换密钥&#xff0c;然后再使用交换的密钥进行加解密数据。 身份验…

[Leetcode][第546题][JAVA][移除盒子][递归][动态规划]

【问题描述】[困难] 【解答思路】 1. 递归 动态规划 class Solution {public int removeBoxes(int[] boxes) {int[][][] dp new int[100][100][100];return calculatePoints(boxes, dp, 0, boxes.length - 1, 0);}public int calculatePoints(int[] boxes, int[][][] dp, int…

leetcode之回溯backtracing专题2

46 Permutations 输入一个不重复的数组 &#xff0c;写出这个数组的排列&#xff0c;不能重复。  例如 输入nums[1,2,3]&#xff0c;输出 [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路&#xff1a;可以看到 第0位&#xff08;从左开始数&#xff…

第二十期:核心交换机的链路聚合、冗余、堆叠、热备份

链路聚合是将两个或更多数据信道结合成一个单个的信道&#xff0c;该信道以一个单个的更高带宽的逻辑链路出现。 一、链路聚合 链路聚合是将两个或更多数据信道结合成一个单个的信道&#xff0c;该信道以一个单个的更高带宽的逻辑链路出现。 链路聚合一般用来连接一个或多个带…

[Leetcode][第20题][JAVA][有效的括号][栈][HashMap]

【问题描述】[中等] 【解答思路】 1. 栈 如果是一个合法的括号序列&#xff0c;遍历到一个右括号(i)时&#xff0c;那么它的前一个括号(i-1)必定是它的另一半(左括号)。反之不是它的另一半或者前面没有括号时&#xff0c;那这个序列必定是非法括号序列。 思路&#xff1a;利用…

Unity3D 物体移动方法总结

1. 简介 在Unity3D中&#xff0c;有多种方式可以改变物体的坐标&#xff0c;实现移动的目的&#xff0c;其本质是每帧修改物体的position。 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态&#xff0c;它包括 位置(position)&#xff0c; 旋转(rotati…

leetcode之回溯backtracing专题3

17 Letter Combinations of a Phone Number 手机上每个数字按钮旁边都有3-4个字母&#xff0c;输入数字字符串&#xff0c;输出可能的字母组合。  例如输入&#xff1a;”23”  输出&#xff1a;[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]…

第二十一期:拜托!面试不要再问我Spring Cloud底层原理

毫无疑问&#xff0c;Spring Cloud 是目前微服务架构领域的翘楚&#xff0c;无数的书籍博客都在讲解这个技术。 不过大多数讲解还停留在对 Spring Cloud 功能使用的层面&#xff0c;其底层的很多原理&#xff0c;很多人可能并不知晓。 因此本文将通过大量的手绘图&#xff0c…