publicvoid GetComStrs(string str1, string str2)
{
///矩阵法求出最长公共子字符串
///第一步:填充矩阵数组,填充规则是
///1、纵横坐标上的字符不相同相同,此位置值为0;
///2、纵横坐标上的字符相同,此位置值为右上方位置的值加1(如果没有右上方位置,即纵横坐标有一个为0时,此位置值为1)
///第二步:扫描矩阵数组,找到最大值maxLength
///第三步:再次扫描矩阵数组,以值为maxLength的位置为基准,通过一个循环拼接字符并赋给comstr
///最后将拼接的字符串添加到列表中
List<string> comStrs = newList<string>();
string comStr = "";
int maxLength = 0;
int[,] arr = newint[str1.Length, str2.Length];
int i, j, k;
//嵌套循环给矩阵赋值
for (i = 0; i < str1.Length; i++)
{
for (j = 0; j < str2.Length; j++)
{
if (str1[i] == str2[j])
{
if (i == 0 || j == 0)
{
arr[i, j] = 1;
}
else
{
arr[i, j] = arr[i - 1, j - 1] + 1; //累加
}
}
else
{
arr[i, j] = 0;
}
}
}
//嵌套循环找到最长子字符串的字符数
for (i = 0; i < str1.Length; i++)
{
for (j = 0; j < str2.Length; j++)
{
if (arr[i, j] > maxLength)
{
maxLength = arr[i, j];
}
}
}
//嵌套循环取出最长的子字符串
for (i = 0; i < str1.Length; i++)
{
for (j = 0; j < str2.Length; j++)
{
if (arr[i, j] == maxLength)
{
comStr = "";
for (k = 0; k < maxLength; k++)
{
comStr += str2[j - maxLength + k + 1];
}
comStrs.Add(comStr); //找到后放入列表中
}
}
}
//打印最长公共子字符串
for (i = 0; i < comStrs.Count; i++)
{
Console.Write(comStrs[i] + " ");
}
}