Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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 匹配S1最后一个字符的两个字符串S1和S2的相等子序列数_String_Algorithm_Dynamic Programming - Fatal编程技术网

String 匹配S1最后一个字符的两个字符串S1和S2的相等子序列数

String 匹配S1最后一个字符的两个字符串S1和S2的相等子序列数,string,algorithm,dynamic-programming,String,Algorithm,Dynamic Programming,给定两个长度不同的字符串S1和S2,找到S1和S2的等子序列数并匹配S1的最后一个字符的有效方法是什么 e、 g S1=ayb S2=axbxxb 在这种情况下,存在两个相等的子序列 "b" => S1[2],S2[2] "b" => S1[2],S2[5] "ab" => S1[0],S2[0] and S1[2],S2[2] "ab" => S1[0],S2[0] and S1[2],S2[5] 我知道这可以用动态规划来解决,如果有人能想出有效解决这个问

给定两个长度不同的字符串S1和S2,找到S1和S2的等子序列数并匹配S1的最后一个字符的有效方法是什么

e、 g

S1=ayb

S2=axbxxb

在这种情况下,存在两个相等的子序列

 "b"  => S1[2],S2[2]
 "b"  => S1[2],S2[5]
 "ab" => S1[0],S2[0] and S1[2],S2[2]
 "ab" => S1[0],S2[0] and S1[2],S2[5]

我知道这可以用动态规划来解决,如果有人能想出有效解决这个问题的办法,那就太好了。

这基本上是一个正则表达式匹配问题

首先,让我们去掉最后一个字符匹配条件。我们想把这个问题简化为一个简单的等子序列问题,没有任何条件

假设S1=a1a2…anZ。设S1'=a1a2…an。进一步假设S2中出现N个Z。对于每一次事件,我们都可以写

假设S2中出现了N个Z。对于每一个事件,我可以写S2i=b1b2…bkiZbki+1。。。。假设S2'=b1b2…bki。现在解决S1'和S2'i的简单问题,对于1..N中的每个i

那么,如何解决这个简单的问题呢

取较短的字符串,说它是S1。现在我们来写abc…t。将其转换为。*a?*b?*…t?*。这是正则表达式。您现在需要计算正则表达式有多少种匹配S2的方式。可以使用基于NFA的算法进行匹配

要实际计算匹配数,需要了解基于NFA的匹配算法的内部工作原理。有一组状态在任何给定时刻都处于活动状态。一个状态可以拆分为两个,或者两个状态可以合并。如果遇到错误的字符,状态可能会死亡。因此,将初始状态的分数设为1。当一个州分裂时,每个新州都会继承父州的分数。当两个州合并时,新州将获得分数之和。当一个州死了,它的分数就会下降

我不确定这是否与您所说的动态规划方法有所不同。最多有2N个匹配项,因此在某些输入上,这将花费很长时间


更新:看起来还可以直接解决最后一个字符匹配问题,而不必将其简化为普通问题。假设在S2:S2=ab…pZq…yZ中有2次出现Z。可以忽略最后一个Z之后的所有字符。可以用S2:.*a?*b?*…p?*Z | Z?*q?*…y?*Z构建正则表达式。更多的引用都是以相同的方式处理的。需要一个看似多余的regexp来保持正确的匹配数,而不仅仅是有匹配的事实。

我不认为这称为子序列编辑:忽略我,这是一个错误subsequence@Argote那么什么是子序列?你确定这是正则表达式问题吗?没有办法解决DP?