我正在考虑这个问题,并且不知道从哪里开始>>
我们给出了一个二进制字符串,除了暴力之外还有其他任何可能的方法来查找不同数字的数量(它们的二进制表示形式是给定字符串中的子字符串)它由它们和它们的总和组成。
例如:
如果给定二进制是:“1101”那么它所包含的可能数字是 -
0,01,10,11,101,110,1101
十进制:
0, 1, 2, 3, 5, 6, 13
sum = 0 + 1 + 2 + 3 + 5 + 6 + 13 = 30
答案 0 :(得分:1)
看一下Suffix Trees,它们可以让你在O(n)中找到字符串中不同子串的计数。
要查找不同数字的总和,我建议您实际计算反向字符串的后缀树,换句话说,您正在计算前缀树。
然后,您可以为每个前缀节点计算其下所有不同数字的总和。
反转字符串更好的原因是我们在数字的末尾添加一个数字很容易(乘以2并加上数字),因此我们可以对我们的小计进行此操作。
如果我们尝试对后缀树执行相同的操作,我们会想要在所有数字的前面添加一个数字,但数字的长度不同,因此很难看到您可以对总
在计算前缀树时要小心,忽略以0开头的分支,否则你也会将001和01以及1视为不同。
我认为这会导致整个操作的成本为O(n),其中n是字符串中的位数。