字符串和动态编程算法

时间:2012-02-17 23:28:12

标签: string algorithm

如果Z是X和Y的子串的串联,则字符串Z是两个其他字符串X和Y的合并。例如,“strMERingGE”是“string”和“MERGE”的合并。给出一个动态编程算法,该算法需要3个字符串并测试第三个是前两个的合并。

这个问题看起来像是最常见的子序列问题的变种,我试过这个算法,但我不确定。

public static String concat(String s1, String s2) {
if (string.IsNullOrEmpty(s1))
    return s2;
if (string.IsNullOrEmpty(s2) )
    return s1;



int len1 = s1.Length - 1;
char last1 = s1[len1];
char first2 = s2[0];


    if (s1[len1 - indexOfLast2] == first2)
    {

int inLast2 = s2.LastIn(last1, Math.Min(len1, s2.Length - 1));
while (inLast2 != -1)
{
        int x = inLast2;
        while ((x != -1) && (s1[len1 - inLast2 + x] == s2[x]))
            x--;
        if (x == -1)
            return s1 + s2.Substring(Last2 + 1);
    }
inLast2 = s2.LastIn(last1, inLast2 - 1);

}


if ( s1 + s2.Substring(Last2 + 1) == 2)
return inLast2  +1;

3 个答案:

答案 0 :(得分:3)

使用此动态编程递归:

匹配(i,j)=匹配(i-1,j)AND(Z [i + j] == X [i])或匹配(i,j-1)AND(Z [i + j] == Y [j])

这将给出2D二进制矩阵。如果在结束和开始之间存在路径(连续的True,仅向上或向左,而不是跨越),则有一个解决方案(通过平移到X和左边的Y匹配来给出解决方案)。

PS:使用以下函数,矩阵将自动记住路径:

Match(i,j) = 
    if Match(i-1,j) AND (Z[i+j] == X[i]):
        1
    elif Match(i,j-1) AND (Z[i+j] == Y[j]):
        2
    else:
        0

答案 1 :(得分:0)

听起来我更像编辑距离算法而不是最常见的子序列。

如果X和Y的长度为m和n,则创建(m + 1) - (n + 1)矩阵。从单元格(i,j)=(0,0)开始,遍历Z,如果当前字符等于X [j],则在矩阵中向右移动一个单元格(j + 1),如果当前字符等于X [j]则向下移动一个单元格(j + 1)当前字符等于Y [i]。如果你最终在单元格(m + 1,n + 1),则输出true;如果在任何一点都不能匹配任何一个字符串中的字符,或者你最终在某个其他单元格中,则输出false。

对于非常相似的编辑距离算法,请参阅:http://en.wikipedia.org/wiki/Levenshtein_distance

答案 2 :(得分:-1)

我没有看过你的东西,但我确实觉得这可以用LCS算法来解决。真正需要知道的是:

  • 是LCS(Z,Y)== Y
  • 是LCS(Z,X)== X
  • 排序(X + Y)==排序(Z)

直观地说,似乎可以解决这个问题......