动态规划:求最大公共子串

 1         /// <summary>
 2         /// 动态规划:求最大公共子串
 3         /// LCS (Longest Common Subsequence)
 4         /// </summary>
 5         private static string LCS(string str1, string str2)
 6         {           
 7             var d = new int[str1.Length, str2.Length];
 8             var index = 0;
 9             var length = 0;
10             for (int i = 0; i < str1.Length; i++)
11             {
12                 for (int j = 0; j < str2.Length; j++)
13                 {
14                     var n = i - 1 >= 0 && j - 1 >= 0 ? d[i - 1, j - 1] : 0;  //左上角
15                     d[i, j] = str1[i] == str2[j] ? 1 + n : 0; //当前节点值 = “1 + 左上角的值”:“0”
16                     if (d[i, j] > length)  //如果是最大值,则记录该值和行号
17                     {
18                         length = d[i, j];
19                         index = i;
20                     }
21                 }
22             }
23             return str1.Substring(index - length + 1, length);
24         }
25 
26         /// <summary>
27         /// 自己写的LCS,可求最大子串,最大串重复情况未考虑
28         /// </summary>
29         /// <param name="str1"></param>
30         /// <param name="str2"></param>
31         /// <returns></returns>
32         private static string myLcs(string str1, string str2)
33         {
34             int[,] arr = new int[str1.Length, str2.Length];
35             int max = 0;
36             int maxIndex = 0;
37             for (int i = 0; i < str1.Length; i++)
38             {
39                 for (int j = 0; j < str2.Length; j++)
40                 {
41                     if (str1[i] == str2[j])
42                     {
43                         arr[i, j] = (i > 0 && j > 0) ? (arr[i - 1, j - 1] + 1) : 1;
44                         if (arr[i, j] > max)
45                         {
46                             max = arr[i, j];
47                             maxIndex = i;
48                         }
49                     }
50                 }
51             }
52 
53             return str1.Substring(maxIndex - max + 1,max);
54         }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值