Algorithm 如何计算从列表L(所有子字符串的列表)中选择k个相等子字符串的方法数

Algorithm 如何计算从列表L(所有子字符串的列表)中选择k个相等子字符串的方法数,algorithm,Algorithm,给定由N小写英文字母组成的字符串S 假设我们有一个由字符串S的所有非空子字符串组成的列表L 我需要计算从列表L(注意,子字符串的长度不必等于K)中精确选择K相等字符串的方法的数量。 1.≤ N≤ 5000 1.≤ K≤ 10^9 例如: Let S=ababa. As List L = {"a", "b", "a", "b", "a", "ab", "ba", "ab", "ba", "aba", "bab", "aba", "abab", "baba", "ababa"} let k=2

给定由
N
小写英文字母组成的字符串
S

假设我们有一个由字符串
S
的所有非空子字符串组成的列表
L

我需要计算从列表
L
(注意,子字符串的长度不必等于
K
)中精确选择
K
相等字符串的方法的数量。 1.≤ N≤ 5000 1.≤ K≤ 10^9

例如:

Let S=ababa. 

As List L = {"a", "b", "a", "b", "a", "ab", "ba", "ab", "ba", "aba", "bab", "aba", "abab", "baba", "ababa"}

let k=2
方法的数量将为7:

("a", "a")
("a", "a") 
("a", "a") 
("b", "b") 
("ab", "ab") 
("ba", "ba") 
("aba", "aba")
同样地:

let k=3
方法的数量将为1:

("a", "a", "a")
“所有子字符串的列表”。为什么要列出所有子字符串?假设你有一个一百万个字符的字符串,有5000亿个子字符串。解决此问题根本不需要所有子字符串的列表

如果K=0,则有一种方法。 如果K=1,则有N种方式

对于k=1到N,长度为k的每个子串可以从0到N-k的索引开始,即N-k+1子串。识别不同的字符串,并使用哈希表计算每个字符串的数量。然后,对于出现n次的每个不同字符串,n>=k,将(n除以k)添加到计数中

就这样


首先查看长度为1的字符串,忽略所有小于K个相等字符串的字符串,计算方法的数量,然后在每个字符串中添加另一个字符,然后重复。假设K=5,字符串中有一百万个字符,并且只有两个长度为6的子字符串出现了五次或更多次,那么您只需要在这两个子字符串中添加字符

没有任何关于您正在学习的语言的细节,我相信您可以通过一个简单的嵌套循环来实现这一点。只需将每个值与数组或列表中的所有值进行比较。

为给定字符串构建


对于此数组,请查找(至少k个)相邻修补程序的常用起始符号。

以下是JavaScript中的一些内容:

函数选择(n,k){

if(k>n)返回0;if(k==0 | | n==k)返回1;var p=n;for(var i=2;i正如其他人所注意到的,您并不真正需要子字符串的列表。因为您只关心相等的子字符串,您只需要计算一个子字符串出现的次数,并且可以使用哈希/字典/映射来跟踪它。然后,当一个子字符串pears
n
times是二项式系数
c(n,k)
。您可以将每个不同子串的所有二项式系数相加,就得到了答案


请注意,如果您针对多个
k
值询问此问题,则只需构建一次哈希/字典/映射。

如果k=1,则方法数为子字符串数,即O(n^2)。但我认为这是正确的方法。我不知道你写了什么。这真的很模糊,也没有多大帮助。你能详细说明一下吗?你能提供给我cTry google中后缀数组的链接吗?我不知道哪种C实现简单而好。武断的一种:使用有用的LCP这真的很难读:1个字母的变量名,一个字母脚本化的choose函数,省略了可选的{},没有注释。请让它变得更好。@Teepeemm谢谢你的评论。请帮助我理解你所说的“更好”是什么意思,因为我的有时取决于我的情绪。这一次,当我看到你的评论时,我的本能是定义“更好”作为提供线索,但仍然给那些还不完全清楚的人留下一些思考的东西。但是,为了逐点说明你的评论,
n
i
j
都是不常见的单字母变量;事实上,它们几乎无处不在;
k
是给定的,
选择
就是cOmn knowledge math,
h
不难猜测,而且整个代码类似于许多伪代码,所以。@Teepeemm说,如果我的答案中有一些具体的东西需要帮助理解,请告诉我,我很乐意提供帮助。正如我所说,我并不总是喜欢在答案中详细说明,因为我认为有时,自己为某件事着墨和挣扎是一个很好的学习工具。我们可以同意,一个完整的答案应该是1个文本解释,2个写得很好的代码,3个适当的注释。我想说3是最不重要的,因为OP应该能够使用1、2或4中的任何一个来重建所有四个。但只提供3意味着OP可以我必须对其进行反向工程(我们同意这很好),或者将其用作黑盒(我们同意这很糟糕)。如果您想为OP留下线索,我建议使用1、2或4,而不是3。(我会将伪代码分类为2而不是3:它不会编译,但您可以通过阅读来重建它的所有内容。)@Teepeemm谢谢你解释你的观点。我认为我衡量答案是否“完整”的方法可能比你的更直观、更离散,更难用语言解释。在这种情况下,我觉得答案似乎是完整的,但我很乐意尝试帮助你解决你遇到的任何具体问题。(我还认为,你可能采用了一个不平等的标准,即:选择这个答案,因为有太多独特、有趣、投票率很高的答案,而这些答案与你评论中的标准相去甚远。)