美文网首页JavaScript 数据结构与算法
JavaScript 算法 计数二进制子串

JavaScript 算法 计数二进制子串

作者: 阿畅_ | 来源:发表于2020-04-12 21:41 被阅读0次

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-binary-substrings
示例:
输入: "00110011"
输出: 6
解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。
请注意,一些重复出现的子串要计算它们出现的次数。

  • 什么意思 ?
    计算相同数量的的 0和 1,但必须是连续的

思路:

循环遍历字符串,每次从 i 个位置开始截取字符
    for (let i = 0; i < str.length - 1; i++) {
        let sub = match(str.slice(i))
        if (sub) {
          ary.push(sub)
        }
      }
根据 截取的字符,做正则匹配

先找出连续出现的 0 1 或者 00 11

 const num = str.match(/^(0+|1+)/)[0]
  • 如果是 00 紧挨的必须是 11,如果是 0 那必须是 1
    // 如果是 0 ^1 会是1 ,然后根据前面 num 去除的个数,进行重复
    const n = (num[0] ^ 1).toString().repeat(num.length)

^(位异或)意思是: 两二进制上下比较只有位不相等时才取1,否则取零
举例说明:
14^15 (14 的二进制 1110,15 的二进制 1111 14^15的结果 0001 -> 结果1)
12 和 5 进行位异或运算,则返回值为 9 为什么 ?

然后在根据动态正则进行匹配
  const reg = new RegExp(`^(${num}${n})`)
  if (reg.test(str)) {
     return RegExp.$1
  }

最后所有代码

  const ary = []
  // 给定任意子输入,都返回第一个符合条件的
  const match = (str) => {
    // 1. 先找出连续的 0 或者 1 
    const num = str.match(/^(0+|1+)/)[0]
    // 如果是 00 紧挨着 必须是 11
    // 如果是 0 紧挨着 必须是 1
    // repeat() 方法字符串复制指定次数
    // 如果是 0 ^1 会是1 ,然后根据前面 j 去除的个数,进行重复字符串
    const n = (num[0] ^ 1).toString().repeat(num.length)
    const reg = new RegExp(`^(${num}${n})`)
    if (reg.test(str)) {
      return RegExp.$1
    }
    return ''
  }

  // 通过 for 循环控制程序运行的流程
  for (let i = 0; i < str.length - 1; i++) {
    console.log('i ----->', str.slice(i))
    let sub = match(str.slice(i))
    if (sub) {
      ary.push(sub)
    }
  }
  return r.length

相关文章

  • 算法合集

    JavaScript版数据结构与算法 javascript反转字符串中的单词JavaScript计数二进制子串Ja...

  • JavaScript 算法 计数二进制子串

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

  • JavaScript计数二进制子串

    问题描述给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1...

  • leetcode

    简单题 696. 计数二进制子串: 一次遍历字符串2020.08.12 连续子序列 vs 子序列 x有序连续思路1...

  • Leetcode 696.计数二进制子串(javascript)

    题目 给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都...

  • 哈希算法

    什么是哈希算法?将任意长度的二进制值串映射到固定长度的二进制值串,这种映射规则就是哈希算法。 哈希算法的应用: 安...

  • 哈希算法

    哈希算法:将任意长度的二进制串,映射为固定长度的二进制值串,这个映射的规则就是哈希算法。 哈希算法作用:1、唯一标...

  • 696. 计数二进制子串

    696. 计数二进制子串 第一次解:暴力方法遍历每个数据,找到其后第一个不同的数,然后看是能与其有匹配数量,有的话...

  • 区块链技术基础—Merkel树

    哈希算法 哈希算法是一种重要的计算机算法,可以将任意长度的二进制值串以不可逆的方式转化为较短的固定长度二进制值串,...

  • 数据结构与算法笔记day18:哈希算法|二叉树|红黑树

    1哈希算法(上) 将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。通过原始数...

网友评论

    本文标题:JavaScript 算法 计数二进制子串

    本文链接:https://www.haomeiwen.com/subject/lphbmhtx.html