【问题标题】:Algorithm for counting substrings in a numerical range计算数值范围内的子串的算法
【发布时间】:2013-10-05 11:22:18
【问题描述】:

我正在寻找一种可用于解决此问题的快速算法:给出 A 和 B 整数(在 [0,10^18] 范围内),并给出 N 的列表(N

示例 1:如果 A=10,B=22,并给出 N=2 个子字符串={1,10};计数为 = 11;数数:10->19 和 21。

Example2: 如果 A=175, B=201, 并给出 N=3 个子串={55,0,200} ;计数为 = 4;数数:180、190、200 和 201。

直接的方法是依次分析 [A,B] 范围内的每个整数,但这不是解决方案,因为范围可能很大(直到 10^18 个整数)。

为了降低问题的复杂性,我做的第一件事是从 N 个子串的原始列表中删除一些无用的子串,这样“没有子串包含在另一个子串中”。例如:{1,10} 变为 {1},{55,0,200} 变为 {55,0}。这不会改变最终计数。

接下来,即使假设我们可以得到 [A,B] 范围内的一个子字符串的计数,我们仍然不能将这个计数与列表中其他子字符串的计数相加,因为一个数字可以包含许多子字符串并且不应该计数不止一次。

有什么想法可以解决问题并获得想要的数量吗?

【问题讨论】:

  • +1 删除无用的子字符串
  • 这个问题有时间限制吗?
  • @vbmaster,这是 ACM 编程竞赛中的一个问题,通常有几秒钟的时间限制......但实际上对我来说,即使是几分钟内的正确解决方案也是需要的......跨度>
  • 下面的答案几乎是正确的,为了更清楚,你基本上需要多次申请Inclusion–exclusion principle
  • 有一种算法类似于 (i) 构造一个 DFA,该 DFA 将具有 N 之一的字符串识别为子字符串 (ii) 使用动态编程来计算匹配字符串的数量。

标签: algorithm numbers substring


【解决方案1】:

我认为这更像是一个组合问题。

  1. 计算A和B之间数字的可能位数。例如2到2000之间,位数可以是1、2、3或4。1位数,你需要计算数字> 2 和 4 位数,你必须计算小于 2000 的数字,即从 1 开始。

  2. 1234563可能的剩余数字(我认为有 10 ^ (k-3) 种方式)。当然,您必须为前导零等打折。
  3. 对所有子字符串重复此操作。

  4. 现在您必须减去包含多个子字符串的字符串。对所有子字符串组合重复上述过程,并从计算值中减去它。

【讨论】:

  • 但是……这个方法不够快,尤其是第4步……“对所有子串组合重复上述过程”,那是一个很大的数字
  • 是的,但最多 18 位数字,不应该有很多子字符串可以共存于一个数字中。事实上,在删除无用的子字符串后,我认为最多 18 个子字符串可能共存。
  • 例如 1000 到 1999 呢?我不认为其中任何一个都可以删除,至少我们需要将这些步骤做 C(1000,4) 次,这仍然是一个很大的数字。
  • 是的,你是对的,我确信上述方法需要并且可以在效率方面进行改进。编辑:实际上对于您提供的子字符串范围,您只需要检查 1 后面有 3 位数字。
  • @AbhishekBansal,当我们处理许多子字符串(减法所需)时,我没有找到步骤(2)的公式。更准确地说:有 m 个子串,有多少个 k 位将它们全部包含在一起?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多