计算字符串的所有子字符串中子序列的出现次数

Count occurrences of subsequence in all substrings of string

提问人:jp99 提问时间:3/26/2023 最后编辑:jp99 更新时间:3/26/2023 访问量:141

问:

我想编写一个算法来计算字符串的所有子字符串中字符子序列的(不相交)出现次数。下面是一个示例。

字符串:“jabcohnnyjohnny”

子序列:“johnny”

包含子序列的子字符串:

jabcohnny
jabcohnnyj
jabcohnnyjo
jabcohnnyjoh
jabcohnnyjohn
jabcohnnyjohnn
jabcohnnyjohnny (2x)
abcohnnyjohnny
bcohnnyjohnny
cohnnyjohnny
ohnnyjohnny
hnnyjohnny
nnyjohnny
nyjohnny
yjohnny
johnny

答案:17

通过蛮力检查每个可能的子字符串非常简单,但我想要一个更有效的解决方案。我试图找出一种比 O(N^2) 时间复杂度更好的算法,其中字符串的长度为 N。我们可以假设子序列的长度很小且恒定,因此对于时间复杂性来说,这不是问题。

我注意到遍历每个可能的子字符串的蛮力方法重复了大量工作。例如,示例中的子字符串 1-6 都对子序列的同一实例进行计数。

我尝试使用动态规划来制定解决方案,基于查找字符串中子序列的出现次数的类似问题。不幸的是,我无法弄清楚如何解释所有子字符串,而不仅仅是从字符串开头开始的子字符串。

我也明白这个问题可以使用两指针或滑动窗口方法解决,但我也无法在这些方面取得太大进展。

字符串 算法 时间复杂度 序列 动态规划

评论

0赞 Neil 3/26/2023
Boyer-Moore是否适用?
1赞 user3386109 3/26/2023
如果字符串是“aabc”,子序列是“abc”,答案是 2 还是 3?换句话说,子阵列中的子序列是否必须不相交,或者它们可以重叠?
1赞 jp99 3/26/2023
@Neil 看起来这个算法处理的是字符串中的子字符串计数,而不是子序列。
2赞 jp99 3/26/2023
@user3386109 子序列必须不相交。您的两个示例的解决方案都是 1。
1赞 user3386109 3/26/2023
对了,您需要在字符串中找到子序列的每个实例,并记录该实例的开始和结束索引。鉴于开始和结束索引的完整列表,这个问题对我来说似乎更容易管理。OTOH,枚举所有子序列比仅仅找到子序列的数量更难。在我的第一个示例(“aabc”)中,有两个实例。在第二个示例“ababcc”中,有 6 个:、、、、、。但是,并且具有相同的开始和结束,因此它们只算作 1。和 相同,所以有 4 个ab--c-ab---ca--bc-a--b-c--abc---ab-cab--c-a--bc-ab---ca--b-c

答: 暂无答案