【问题标题】:Split binary string such that every substring has the same number of 1's and 0's拆分二进制字符串,使每个子字符串具有相同数量的 1 和 0
【发布时间】:2022-01-21 06:48:01
【问题描述】:

我试图拆分二进制字符串,使每个子字符串具有相同数量的 1 和 0。我的意思是,给定一个像 0010110010 这样的字符串,它可以分成 00101 10010,两个子字符串都有 2 个 1 和 3 个 0。谁能指出我类似的东西。抱歉,我没有要分享的代码。

【问题讨论】:

  • 这个问题似乎没有明确说明。像 (01)^n 这样的字符串可以以多种方式拆分,这些方式在 n 中是指数的。你对哪一个感兴趣?
  • @Gene:除非我遗漏了什么,否则 (01)ⁿ 只能以 O(n) 方式拆分:n 的每个除数都有一种方式。 (比如6的除数是1、2、3、6,所以010101010101可以拆分为一个子串(010101010101)、两个子串(010101和010101)、三个子串(0101、0101和0101),或者四个子字符串(01、01、01、01、01 和 01)。)但无论哪种方式,你都是对的,显然有不止一种可能性。

标签: algorithm binary substring combinations permutation


【解决方案1】:

假设一个给定的字符串可以被拆分成 n 个满足条件的子字符串,每个子字符串都有 a 0 和 b 1。你猜怎么了?所有子字符串的长度必须相同(== a + b)!因此搜索空间非常有限:

  1. 您尝试将原始字符串的长度除以 2,3,4...(int)string.length()/2。只有没有余数的除数才是有效的。例如,您有字符串 010010010,您不能将其分成 2 个子字符串并让两个子字符串具有相同数量的 0 和 1,因为 9/2=4 R 1。
  2. 您只需逐个尝试除数。说将原始字符串分成 n 个两个字符长的子字符串,然后我可以检查 substrings[0]、substring[1]...是否具有相同数量的 0 和 1...

如果只需要一种解决方案,时间复杂度应该不超过o(n^2)

【讨论】:

  • 感谢您的评论。是的,我知道所有子字符串的长度都相同。
【解决方案2】:
  • NK1和0个K0的子串,表示相同长度的子串。
  • 整个字符串的长度必须为 N*(K1+K0)
  • 整个字符串也必须有 N*K1 个 1 和 N*K0 个 0。
  • 所以你可以数全一,NK1,得出零个数NK0,N是gcd(NK1, NK0)的因数时间>。 (最大公约数是一个简单的算法。)
  • 总有一个解决方案:重复 1 个子字符串。

我们当然不在这里解决任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2021-06-16
    • 2020-06-29
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多