String 确定性自动机,用于在另一个字符串的字符串中查找子序列的数目
确定自动机在字符串中查找子序列的数量? 如何构造DFA以将出现字符串的数量作为另一个字符串中的子序列来查找 例如,在“ssstttrrriinngggg”中,我们有3个子序列,它们构成字符串“string” 另外,要查找和要搜索的字符串都只包含特定字符集中的字符。 我有一些关于在堆栈中存储字符的想法,将它们相应地弹出,直到我们匹配为止,如果不匹配,请再次推送。 请告诉DFA解决方案 重叠匹配 如果您希望计算重叠序列的数量,那么您只需构造一个与字符串匹配的DFA,例如 1-(如果见s)->2-(如果见t)->3-(如果见r)->4-(如果见i)->5-(如果见n)->6-(如果见g)->7 然后使用动态规划计算看到每个角色后处于每个状态的方式数。有关更多详细信息,请参阅此问题的答案String 确定性自动机,用于在另一个字符串的字符串中查找子序列的数目,string,algorithm,theory,dfa,subsequence,String,Algorithm,Theory,Dfa,Subsequence,确定自动机在字符串中查找子序列的数量? 如何构造DFA以将出现字符串的数量作为另一个字符串中的子序列来查找 例如,在“ssstttrrriinngggg”中,我们有3个子序列,它们构成字符串“string” 另外,要查找和要搜索的字符串都只包含特定字符集中的字符。 我有一些关于在堆栈中存储字符的想法,将它们相应地弹出,直到我们匹配为止,如果不匹配,请再次推送。 请告诉DFA解决方案 重叠匹配 如果您希望计算重叠序列的数量,那么您只需构造一个与字符串匹配的DFA,例如 1-(如果见s)->2-(如
DP[a][b] = number of ways of being in state b after seeing the first a characters
= DP[a-1][b] + DP[a-1][b-1] if character at position a is the one needed to take state b-1 to b
= DP[a-1][b] otherwise
对于b>1,以DP[0][b]=0开始,DP[0][1]=1
那么重叠字符串的总数是DP[len(string)][7]
非重叠匹配
如果您正在计算非重叠序列的数量,那么如果我们假设要匹配的模式中的字符是不同的,我们可以稍微修改一下:
DP[a][b] = number of strings being in state b after seeing the first a characters
= DP[a-1][b] + 1 if character at position a is the one needed to take state b-1 to b and DP[a-1][b-1]>0
= DP[a-1][b] - 1 if character at position a is the one needed to take state b to b+1 and DP[a-1][b]>0
= DP[a-1][b] otherwise
对于b>1,从DP[0][b]=0开始,DP[0][1]=无穷大
那么非重叠字符串的总数是DP[len(string)][7]
如果要匹配的模式包含重复字符(例如“字符串”),则这种方法不一定能给出正确答案。我建议您编写一些代码并运行它。这就是算法的典型实现方式。您描述的是下推式DFA,它不完全是DFA,可以表示上下文无关的语言,而“经典”DFA只能表示常规语言。@H2CO3我要编写的代码是,使用一些转动机器磁带的思想,在其他字符串中找到字符串的第一个字母,然后下一封信在开头再次扫描……我想问的是,我们能不能为这样一个问题设计DFA?你的问题不够具体。您是否在搜索给定的子序列,例如从1ab2cd3ef检查它是否包含123,是否在搜索所有子序列?顺便说一句:如果你能为你的任务编写一个正则表达式(经典教科书,而不是PERL或Java),你显然已经完成了。我认为对于非重叠问题,第2行和第3行中的解决方案部分条件是相同的吗?@Peter de Rivaz我们是否应该在第3行中增加1个DP[a][b+1]呢?或者从第2行的DP[a-1][b-1]中减去-1?