给定二进制字符串中的不同数字的数量及其总和

时间:2013-08-23 09:11:07

标签: algorithm bit-manipulation bit

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

我们给出了一个二进制字符串,除了暴力之外还有其他任何可能的方法来查找不同数字的数量(它们的二进制表示形式是给定字符串中的子字符串)它由它们和它们的总和组成。

例如:

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

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

十进制:

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

sum = 0 + 1 + 2 + 3 + 5 + 6 + 13 = 30

1 个答案:

答案 0 :(得分:1)

HINTS

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

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

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

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

如果我们尝试对后缀树执行相同的操作,我们会想要在所有数字的前面添加一个数字,但数字的长度不同,因此很难看到您可以对总

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

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