Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 确定性自动机,用于在另一个字符串的字符串中查找子序列的数目_String_Algorithm_Theory_Dfa_Subsequence - Fatal编程技术网

String 确定性自动机,用于在另一个字符串的字符串中查找子序列的数目

String 确定性自动机,用于在另一个字符串的字符串中查找子序列的数目,string,algorithm,theory,dfa,subsequence,String,Algorithm,Theory,Dfa,Subsequence,确定自动机在字符串中查找子序列的数量? 如何构造DFA以将出现字符串的数量作为另一个字符串中的子序列来查找 例如,在“ssstttrrriinngggg”中,我们有3个子序列,它们构成字符串“string” 另外,要查找和要搜索的字符串都只包含特定字符集中的字符。 我有一些关于在堆栈中存储字符的想法,将它们相应地弹出,直到我们匹配为止,如果不匹配,请再次推送。 请告诉DFA解决方案 重叠匹配 如果您希望计算重叠序列的数量,那么您只需构造一个与字符串匹配的DFA,例如 1-(如果见s)->2-(如

确定自动机在字符串中查找子序列的数量? 如何构造DFA以将出现字符串的数量作为另一个字符串中的子序列来查找

例如,在“ssstttrrriinngggg”中,我们有3个子序列,它们构成字符串“string”

另外,要查找和要搜索的字符串都只包含特定字符集中的字符。 我有一些关于在堆栈中存储字符的想法,将它们相应地弹出,直到我们匹配为止,如果不匹配,请再次推送。 请告诉DFA解决方案

重叠匹配 如果您希望计算重叠序列的数量,那么您只需构造一个与字符串匹配的DFA,例如

1-(如果见s)->2-(如果见t)->3-(如果见r)->4-(如果见i)->5-(如果见n)->6-(如果见g)->7

然后使用动态规划计算看到每个角色后处于每个状态的方式数。有关更多详细信息,请参阅此问题的答案

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?