String 计算作为所有四个字符串的子序列的不同非空字符串

String 计算作为所有四个字符串的子序列的不同非空字符串,string,algorithm,dynamic-programming,String,Algorithm,Dynamic Programming,下面是一个函数,它要求您计算不同的非空字符串,这些字符串是所有四个字符串的子序列。比如说 Input: aabb abab baba acba Output: 4 The four sequences are "a", "b", "aa", and "ab". 如何解决这个问题?为了不破坏乐趣,我不发布完整的答案,只是给你一些想法 将四个字符串写为A,B,C,D 对于非负整数i,请为通过删除第一个i字母获得的a的子字符串写入a。同样的符号也适用于B、C、D 对于字母X(从a到z)和

下面是一个函数,它要求您计算不同的非空字符串,这些字符串是所有四个字符串的子序列。比如说

Input:
 aabb
 abab
 baba
 acba

Output:
 4
The four sequences are "a", "b", "aa", and "ab".

如何解决这个问题?

为了不破坏乐趣,我不发布完整的答案,只是给你一些想法

将四个字符串写为
A
B
C
D

对于非负整数
i
,请为通过删除第一个
i
字母获得的
a
的子字符串写入
a
。同样的符号也适用于
B
C
D

对于字母
X
(从
a
z
)和四个非负整数
i
j
k
l
,定义
F(X,i,j,k,l)
a
B
C
,的不同公共子序列的数目,
D
以字母
X
开头

尝试查找这些
F
之间的重复关系。这提供了一种动态规划方法

编辑:更多细节在这里

F(X,i,j,k,l)
可以如下计算:让
i0
成为
i
之后的第一个索引,使得
A[i0]=X
。类似地定义
j0
k0
l0

只有在所有四个子字符串中出现
X
时,才会定义标记
i0
j0
k0
l0
。否则,显然
F(X,i,j,k,l)=0

一旦定义了四个标记,以
X
开头的
A
B
C
D
的任何公共子序列都将采用
xs
的形式,其中
s
A
B
C
D
的公共子序列。因此,公式如下:

F(X,i,j,k,l)=所有F(Y,i0,j0,k0,l0)之和

其中,总和从
a
z
覆盖所有
Y


最后一个技巧:使用延迟传播来避免无用的计算。

噢!thanx对于这一令人敬畏的建议,我尝试使用两个字符串的LCS方法建立递归,但当时无法解决。thanx you@WhatsUp,你真的让我高兴,这是我接受的代码如果有人需要进一步帮助@sumit在这种情况下,你介意接受答案吗?