代码改变世界

最长公共子串算法的学习笔记

2011-04-16 20:01  Aga.J  阅读(446)  评论(0编辑  收藏  举报

Longest Common Subsequence

最长公共子串

算法原理:

1 将两个字符串分别以行和列组成矩阵

2 计算每个节点的行和列的字符是否相同,如果相同则为1

3 通过找出值为1的最长对角线就可以得到最长公共子串

(在第3步中可以这样优化算法,就是把相同字符所在的位置的值加上左上角d[i-1][j-1]的值,这样就可以获得最长公共子串的长度,更可以得到公共子串是什么)

这个算法的原理很浅显易懂,很快理解为什么可以这样做,所以这里就不赘述了。直接贴出来自网络的参考代码。

public static string LCS(string s1,string s2)

{

if(s1==s2)

return s1;

else if (String.IsNullOrEmpty(s1) || String.IsNullOrEmpty(s1))

return null;

var d = new int[s1.Length, s2.Length];

var index=0;

var length=0;

for( int i =0;i<s1.Length;i++)

for(int j=0;j<s2.Length;j++)

{

var n= (i-1>=0 && j-1>=0 )?d[i-1,j-1]:0 ;

d[i,j]= s1[i]==s2[j]?1+n:0;

if(d[i,j]>length)

{

length=d[i,j];

index=i;

}

}

return s1.Substring(index-length+1,length);

}