【问题标题】:number of different numbers in a given binary string and their sum给定二进制字符串中不同数字的数量及其总和
【发布时间】:2013-08-23 09:11:07
【问题描述】:

我正在考虑这个问题,但不知道从哪里开始>>

我们得到一个二进制字符串,除了暴力破解之外,还有其他可能的方法来找到它所包含的不同数字的数量(它们作为给定字符串中的子字符串的二进制表示)及其总和。

例如:

如果给定的二进制是:“1101”,那么它可能包含的数字是 -

0,01,10,11,101,110,1101

十进制:

0, 1, 2, 3,  5,  6,  13

总和 = 0 + 1 + 2 + 3 + 5 + 6 + 13 = 30

【问题讨论】:

  • 暴力破解是指找到给定数字中二进制数的所有排列/组合吗?
  • 该字符串的最大大小是多少。蛮力将需要 n*(n-1)/2 次迭代,即 O(n^2)。是不是太长了?
  • @HAL 我所说的蛮力是查看所有可能的长度字符串并存储我们到目前为止看到的数字,并比较到目前为止是否看到了这个数字。
  • @bytefire>> 我正在寻找一种时间复杂度较低的算法。
  • 是所有可能长度的所有可能子串。 111 未作为子字符串提及。

标签: algorithm bit-manipulation bit


【解决方案1】:

提示

看看Suffix Trees,它们可以让你在 O(n) 的时间内找到一个字符串中不同子字符串的计数。

要找到不同数字的总和,我建议您实际计算反转字符串的后缀树,换句话说,您正在计算前缀树。

然后,您可以为每个前缀节点计算其下所有不同数字的总和。

反转字符串更好的原因是我们在数字的末尾添加一个数字很容易(乘以 2 并添加数字),因此我们可以对小计进行此操作。

如果我们尝试对后缀树做同样的事情,我们希望在所有数字的前面添加一个数字,但是数字的长度不同,因此很难看出您可以对总计。

在计算前缀树时要小心忽略以 0 开头的分支,否则您也会将 001 和 01 和 1 视为不同的。

我相信这会导致整个操作的成本为 O(n),其中 n 是字符串中的位数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-25
    • 2013-03-25
    • 2016-10-07
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    相关资源
    最近更新 更多