LCS (Longest Common Subsequence) 算法用于找出两个字符串最长公共子串(C#版)
网上看到的,分享给大家看一下;
LCS (Longest Common Subsequence) 算法用于找出两个字符串最长公共子串。
算法原理:
(1) 将两个字符串分别以行和列组成矩阵。
(2) 计算每个节点行列字符是否相同,如相同则为 1。
(3) 通过找出值为 1 的最长对角线即可得到最长公共子串。
人 民 共 和 时 代
中 0, 0, 0, 0, 0, 0
华 0, 0, 0, 0, 0, 0
人 1, 0, 0, 0, 0, 0
民 0, 1, 0, 0, 0, 0
共 0, 0, 1, 0, 0, 0
和 0, 0, 0, 1, 0, 0
国 0, 0, 0, 0, 0, 0
为进一步提升该算法,我们可以将字符相同节点(1)的值加上左上角(d[i-1, j-1])的值,这样即可获得最大公用子串的长度。如此一来只需以行号和最大值为条件即可截取最大子串。
人 民 共 和 时 代
中 0, 0, 0, 0, 0, 0
华 0, 0, 0, 0, 0, 0
人 1, 0, 0, 0, 0, 0
民 0, 2, 0, 0, 0, 0
共 0, 0, 3, 0, 0, 0
和 0, 0, 0, 4, 0, 0
国 0, 0, 0, 0, 0, 0
算法实现:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace LCS 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 try 13 { 14 Console.WriteLine("请输入目标字符串A:"); 15 string s = Console.ReadLine(); 16 Console.WriteLine("请输入目标字符串B:"); 17 string t = Console.ReadLine(); 18 string strReturn = LCS(t, s); 19 if (string.IsNullOrEmpty(strReturn)) 20 { 21 Console.WriteLine("您输入的两个字符串没有找到最长的公共字符串."); 22 } 23 else 24 { 25 Console.WriteLine("CLS算法为您找到的正常的公共字符串是:" + strReturn); 26 } 27 } 28 catch (Exception ex) 29 { 30 Console.WriteLine("error:"+ex.Message); 31 } 32 } 33 34 /// <summary> 35 /// 最大公共字符串 36 /// LCS算法 37 /// </summary> 38 /// <param name="str1">字符串A</param> 39 /// <param name="str2">字符串B</param> 40 /// <returns></returns> 41 private static string LCS(string str1, string str2) 42 { 43 if (str1 == str2) 44 return str1; 45 else if (String.IsNullOrWhiteSpace(str1) || String.IsNullOrWhiteSpace(str2)) 46 return null; 47 48 var d = new int[str1.Length, str2.Length]; 49 var index = 0; 50 var length = 0; 51 52 for (int i = 0; i < str1.Length; i++) 53 { 54 for (int j = 0; j < str2.Length; j++) 55 { 56 //左上角 57 var n = i - 1 >= 0 && j - 1 >= 0 ? d[i - 1, j - 1] : 0; 58 59 //当前节点值等于“左上角的值+1”:“0” 60 d[i, j] = str1[i] == str2[j] ? n + 1 : 0; 61 62 //如果是最大值,记录该值和行号 63 if (d[i, j] > length) 64 { 65 length = d[i, j]; 66 index = i; 67 } 68 } 69 } 70 71 return str1.Substring(index - length + 1, length); 72 } 73 } 74 }
posted on 2014-06-21 20:12 09GISer_Heng 阅读(652) 评论(0) 收藏 举报
浙公网安备 33010602011771号