String 字符串与动态规划算法

String 字符串与动态规划算法,string,algorithm,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

如果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;

我还没有看过你的东西,但我确实觉得这可以用LCS算法解决。实际上,您需要了解的是:

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

直观地看,这似乎起到了作用……

我觉得它更像编辑距离算法,而不是最长的公共子序列

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


有关编辑距离算法(非常类似),请参见:

使用此动态编程递归:

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

这将给出一个2D二进制矩阵。如果在结束和开始之间有一条路径(连续为真,仅向上或向左,不跨越),则有一个解决方案(通过将匹配转换为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

这道题的一个几乎相同的版本是我昨天算法考试的最后一道题。这几乎是正确的,但动态编程意味着使用数组进行某种递归调用。此外,该算法将更像是一个布尔返回值而不是一个字符串。。。下次我会小心我的直觉:)谢谢亲爱的ElKamina。我只是想知道,在我确定了S1和S2的索引之后,我是否应该这样做?这是正确的答案@劳拉:你会叫Match(X.Length-1,Y.Length-1),这会给你答案。您必须将记忆添加到递归函数中,或者以一种迭代填写表格的方式重写它。@Lara如Igor所述,只需记忆Match(i,j)的值,并调用Match(长度(X)-1,长度(Y)-1)