该问题为动态规划的经典问题。输入两个字符串,如cnblogs和belong,则最长公共子序列为blog。
设序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的一个最长公共子序列Z=<z1, z2, …, zk>,则:
其中Xm-1=<x1, x2, …, xm-1>,Yn-1=<y1, y2, …, yn-1>,Zk-1=<z1, z2, …, zk-1>。
代码如下:
static string GetLongestCommonStr(string str1, string str2)
{if (str1 == "" || str2 == "")
{
return "";
}
int len1 = str1.Length;
int len2 = str2.Length;
string[,] matrix = new string[len1+1,len2+1];
for (int i = 0; i <= str1.Length; i++)
matrix[i, 0] = "";
for (int j = 0; j <= str2.Length; j++)
matrix[0, j] = "";
for (int i = 1; i <= len1; i++)
{
for (int j = 1; j <= len2; j++)
{
if (str1[i-1] == str2[j-1])
{
matrix[i, j] = matrix[i - 1, j - 1] + str1[i-1];
}
else
{
int l1 = matrix[i, j - 1].Length;
int l2 = matrix[i - 1, j].Length;
if (l1 > l2)
{
matrix[i, j] = matrix[i, j - 1];
}
else
{
matrix[i, j] = matrix[i - 1, j];
}
}
}
}
return matrix[len1,len2];
}
static void Main(string[] args)
{
string ret = GetLongestCommonStr("cnblogs", "belong");
System.Console.WriteLine(ret);
Console.Read();
}