算法查找大数范围内的子串数

时间:2013-09-26 22:47:13

标签: algorithm numbers substring dynamic-programming aho-corasick

我对此练习有疑问:

根据1 <= A,B <= 10^18给出范围 A B 和一些整数表示带Ni的子串1 <= i <= 1000;
返回包含任何给定子字符串的 A,B (包括 A B )范围内的可能数字总数。

输入

A, B, i 
N1
N2
...
Ni 

例如:

简单输入

10 22 2 
1 
10

简单输出

11

说明:10到22的范围包含以下数字,10* 11* 12* 13* 14* 15* 16* 17* 18* 19* 20 21* 22包含子串10或1的有效数字标有(*)

我们如何计算范围内可能数字的总数?

1 个答案:

答案 0 :(得分:1)

首先,需要了解Aho-Corasick自动化以及动态规划。

我们将问题从范围 [A,B] 分为两个问题 [1,B] - [1,A-1]

构建以下动态编程方法。

DP[position][is_equal_to_A][which_node_in_automation];
  • 位置表示数字长度
  • is_equal_to_A 表示现在等于A的前缀

然后我们只列举当前号码的最后一个数字。