问题描述:求两字符串的连续最大公共子字符串
属于动态规划问题,使用LCS算法。
参考:http://blog.csdn.net/yebanxin/article/details/52190683
如果我们用f(i,j)表示从字符串s1的第i个位值和s2的第j个位值开始匹配,可匹配的最大字符串长度。那么有这个关系f(i,j)=f(i+1,j+1)+1。
LCS算法的思路和优化都是根据这个公式来的。
自己用js写了一个。算法复杂度O(mn)。
zuidapipei("hello","hanellb"); function zuidapipei(a,b){ var n1 = a.length; var n2 = b.length; var arr=[]; for(var i=0;i<n1;i++){ arr[i]=[]; for(var j=0;j<n2;j++){ if(a.charAt(i)===b.charAt(j)){ arr[i][j]=1; } else{ arr[i][j]=0; } } } console.log(clone(arr,n1,n2)); for(var i=n1-2;i>=0;i--){ for(var j=n2-2;j>=0;j--){ if(arr[i+1][j+1]&&arr[i][j]){ console.log(i,j,arr[i+1][j+1],arr[i][j]); arr[i][j]+=arr[i+1][j+1]; } } } console.log(arr); var max = 0; var id1 = 0; var id2 = 0; for(var i=0;i<n1;i++){ for(var j=0;j<n2;j++){ if(arr[i][j]>max){ max=arr[i][j]; id1=i; id2=j; } } } console.log("最大匹配长度是:",max); console.log("匹配的字符串是:",a.substr(id1,max)); } function clone(arr,n1,n2){ var result = []; for(var i=0;i<n1;i++){ result[i]=[]; for(var j=0;j<n2;j++){ result[i][j]=arr[i][j]; } } return result; }
还可以用LCS算法计算两个字符串的相似度。
https://www.cnblogs.com/three-zone/archive/2013/06/06/LevenshteinDistance.html
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。