找到第一个字符串的所有字符串的子字符串数,它们是第二个字符串

时间:2017-06-30 17:40:36

标签: count permutation dynamic-programming

需要一种方法来解决这个问题!

问题:给定两个包含小写字母的字符串计数匹配数量在第一个字符串的所有不同字符串中以10 ^ 9 + 7个非交叉子串为模,这样它们就等于第二个字符串的任何字谜。

示例:
1)字符串1:“ABC”,字符串2:“AB”
答案= 4
说明:'ABC','BAC','CAB','CBA'各自贡献1个这样的匹配。

2)字符串1:“ABCAB”,字符串2:“AB”
答案= 40
说明:字符串1'ABABC'的一个可能的Anagram,其匹配计数为2,即'AB'和'AB',而'BABCA'仅提供一个匹配为'BA'或'AB'。

约束:
n,m是第一和第二串的长度
0< n< 200
0< m< 100

我尝试过的方法包括预先计算前20个因子模10 ^ 9 + 7然后从给定的字符串计算字符串可以有多少个最大非交叉模式(mx)并从p = 1循环到mx并计算包含正交p个非交叉子串(即字符串2)模式的第一个字符串的重新排列次数。

我在这里缺少一种不同的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用另一种方法 -

1)计算string2的字谜数量。你可以谷歌排列和组合来获得一个方法(在O(1))(比如说x)。

2)最多计算string1可以贡献多少string2。这可以通过计算字符串字符在string2中重复的次数来完成。比如你的第二个例子'A'和'B'在第二个字符串中重复两次,这样你一次最多可以得到一个字谜。注意 - 如果字符频率不匹配则选择最小数字。就像对于某些字符串'A'重复三次和'B'两次一样,你最多可以得到2个字谜,这样你就可以获得最低重复字符的频率。

3)使用排列组合公式计算答案 -

  • string1 anagrams的数量,只有一个字符串为string x*(n1-n2+1),其中n1和n2是string1和2的长度。
  • 有两个字谜 - (n1- 2*n2+2)*x*x
  • 等等