计算不同的非空字符串,它们是所有四个字符串的子序列

时间:2016-02-17 11:08:23

标签: string algorithm dynamic-programming

这是一个spoj problem,它要求您计算不同的非空字符串,它们是所有四个字符串的子序列。例如

Input:
 aabb
 abab
 baba
 acba

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

将四个字符串写为ABCD

对于非负整数i,请为通过删除第一个A<i>字母获得的A子字符串写i。相同的表示法适用于B<i>C<i>D<i>

对于一封信X(从az)和四个非负整数ijk,{ {1}},将l定义为以F(X, i, j, k, l)A<i>B<j>C<k>开头的D<l>X的不同公共子序列的数量F 1}}。

尝试找到这些F(X, i, j, k, l)之间的重复关系。这提供了一种动态编程方法。

编辑:此处有更多详情。

i0的计算方法如下:让i成为A[i0] = X之后的第一个索引j0。让k0l0i0同样定义。

仅当j0出现在所有四个子字符串中时,才会定义indice k0l0XF(X, i, j, k, l) = 0。否则,显然A<i>

一旦定义了四个indice,从B<j>开始的C<k>D<l>XX s的任何公共子序列都将具有以下形式s,其中A<i0>B<j0>C<k0>D<l0>F(X, i, j, k, l) = sum of all F(Y, i0, j0, k0, l0)的常见子序列。因此公式:

Y

其中总和在az的所有-x上运行。

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