layout: posttitle: PHP 计数二进制子串
subtitle: PHP 计数二进制子串
date: 2020-08-10
author: he xiaodong
header-img: img/default-post-bg.jpg
catalog: true
tags:
- Go
- PHP
- LeetCode
- 计数二进制字串

PHP 计数二进制子串

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

重复出现的子串要计算它们出现的次数。

示例 1 :

  1. 输入: "00110011"
  2. 输出: 6
  3. 解释: 6个子串具有相同数量的连续10:“0011”,“01”,“1100”,“10”,“0011 01”。
  4. 请注意,一些重复出现的子串要计算它们出现的次数。
  5. 另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。

示例 2 :

  1. 输入: "10101"
  2. 输出: 4
  3. 解释: 4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续10

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-binary-substrings

解题思路

用last来记录之前一种数字的个数, cur来记录当前数字的个数; 当last >= cur的时候, res ++;

代码
  1. class Solution {
  2. /**
  3. * @param String $s
  4. * @return Integer
  5. */
  6. // 1. 一次遍历,记录1 和 0 的个数差,计算可以满足要求的结果的个数
  7. function countBinarySubstrings($s) {
  8. $last = 0;
  9. $cur = 1;
  10. $res = 0;
  11. // last : 前一种数字的个数统计 ,从 0 开始,刚开的时候前面没有另一种值,所以为 0
  12. // cur : 当前这种数字的个数统计 ,从 1 开始,因为就是从自己开始,当然为 1
  13. // res : 满足要求的结果数量
  14. $length = strlen($s);
  15. for ($i = 1; $i < $length; $i++) {
  16. // 如果相邻值的种类没有改变
  17. if($s[$i] == $s[$i-1]) {
  18. // 满足当前数字的个数数量 ++
  19. $cur ++;
  20. } else {
  21. // 如果改了,说明从 0 变到 1 了,或者从 1 变到 0 了
  22. // 那刚才的 cur 就变成了现在的 last
  23. $last = $cur;
  24. // 当前值回到初始状态,1
  25. $cur = 1;
  26. }
  27. // 如果前一种值比当前的值多,就表明可以满足一个
  28. // 当 last 小于cur的时候,
  29. // 就比如 00 111, 从00 1 到 00 11 到 00 111 加了两次 res,
  30. // 第三次就加不了了,因为00111 已经不满足个数相等了
  31. if ($last >= $cur) {
  32. $res ++;
  33. }
  34. }
  35. return $res;
  36. }
  37. }

参考链接: 此题下谢正华的评论

最后恰饭 阿里云全系列产品/短信包特惠购买 中小企业上云最佳选择 阿里云内部优惠券