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 }

 

转自:http://www.haogongju.net/art/1170450

posted on 2014-06-21 20:12  09GISer_Heng  阅读(652)  评论(0)    收藏  举报

导航