LCS (Longest Common Subsequence) 字符串最长公共子串算法
来源:互联网 发布:java语言可以做什么 编辑:程序博客网 时间:2024/06/05 05:44
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
算法实现:public static string LCS(string s1, string s2){ if (s1 == s2) return s1; else if (String.IsNullOrEmpty(s1) || String.IsNullOrEmpty(s2)) 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; // 当前节点值 = "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);}
- LCS (Longest Common Subsequence) 字符串最长公共子串算法
- Longest Common Subsequence (LCS)最长公共子串
- 最长公共子序列与最长公共子串(Longest Common Subsequence, LCS)
- 最长公共子序列(Longest Common Subsequence LCS)
- uva 10405 Longest Common Subsequence 最长公共子序列 LCS
- 最长公共子序列(LCS, Longest Common Subsequence), POJ 1458
- 求最长公共子序列Longest Common Subsequence LCS
- 最长公共子序列(Longest-Common-Subsequence,LCS)
- 最长公共子序列问题LCS Longest Common Subsequence
- uva10405 - Longest Common Subsequence(LCS,最长公共子序列)
- 最长公共子序列(Longest Common Subsequence, LCS)
- 最长公共子序列(Longest Common Subsequence,LCS)
- 最长公共子序列,Longest-Common-Subsequence(LCS)
- 最长公共子序列LCS(The longest common subsequence)
- 最长公共子序列问题(LCS) Longest common subsequence
- 最长公共子序列问题(Longest common subsequence,LCS)
- LCS(Longest Common Subsequence 最长公共子序列)
- 最长公共子序列问题(LCS, Longest Common Subsequence)
- (6)设计模式笔记[Builder模式]
- (索引)Android SDK 2.2 开发环境安装
- Android Intent的几种用法全面总结
- 转载:c语言变长参数函数的实现
- 想在这里下装好的资料 有什么好的方法吗??
- LCS (Longest Common Subsequence) 字符串最长公共子串算法
- SIFT 第六步: 生成SIFT特征
- java常见面试题总结
- jquery插件资源集合
- Struts2 数据输入校验(1) —— 函数验证
- how to make a good resume from Google Engineer
- 斐波那契数列算法
- MFC 下 线程编程的调用线程外的函数方法
- Android System Services 环境浅析