如果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;
答案 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算法来解决。真正需要知道的是:
直观地说,似乎可以解决这个问题......