每日力扣-检查二进制字符串字段

94 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。

题目(已做删减处理)

给你一个二进制字符串 s ,该字符串 不含前导零 。如果 s 包含 零个或一个由连续的 '1' 组成的字段 ,返回 true 。否则,返回 false 。如果 s 中 由连续若干个 '1' 组成的字段 数量不超过 1,返回 true 。否则,返回 false 。

分析

一道特别简单的字符串类型的算法题。虽然题目上强调是 二进制字符串,刚开始的时候可能会警惕:会不会是和二进制有关的算法 or 知识点呢?但是继续往下面看,实际上此题目只是从二进制字符串这个表面上的意思,展开题目的要求。 题目中已经明确表示:不含前导零。那么我们可以从题目中的要求中提取两个情况:

  • 字符串中有0个包含1的字段,那么字符串其实可以表示为0000...000
  • 字符串有个包含1的字段,那么字符串可以表示为111....00000

其实从我们的判断过程中,大家就可以明确的知道,满足题目要去的字符串就2种情况,而对应的,不满足题目要求的字符串,一定包含01字段。那么我们可以简单的归纳为:

如果字段中包含01则不满足条件,那么,题目的解法其实一句话就可以完成:

return str.contains("01")? false :true;

如果你对于上述的推导表示有点困难,其实我们完全可以按照题目的要求,使用for循环进行处理:

  1. 定义一个tmp,方便处理。for循环,如果前端是 0 ,当前是 1,那么就计算+1;
  2. 如果计算的结果大于1,则证明超过要求,返回false,对应的,小于1,返回true.

总结

特别简单的一道字符串题目。但是和常见的easy题目不相同的是,这道题目更多的在于思考的过程:能不能从内题目中提炼出对应的规则;能不能猜测题目中的真正需要找到的字符串块。一旦知道或者推导出,项目就特别简单了。这里也给学习算法的同学们提了个醒:做题目前要多想、多推导。

结题证明

image.png