Java——最长公共子串问题LCS
来源:互联网 发布:java静态代理实现 编辑:程序博客网 时间:2024/06/07 09:44
Java——最长公共子串问题LCS
求最长公共子序列(Longest Common Subsequence, LCS):如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。但是并不要求子串(字符串一)的字符必须连续出现在字符串二中。
采用一个二维矩阵来记录中间的结果。比如"abab"和"aba",如果两个字符相等就在矩阵中填1
a b a b
a 1 0 1 0
b 0 1 0 1
a 1 0 1 0
这样矩阵的斜对角线最长的那个就是最长公共子串“aba"。
为了直接得到矩阵中最长的对角线,可以当要在矩阵填1时让它等于其左上角元素加1:
a b a b
a 1 0 1 0
b 0 2 0 2
a 1 0 3 0
这样矩阵中的最大元素就是最长公共子串的长度,而它所在的那条对角线就是最长公共子序列。下面是矩阵元素的计算公式:
package com.kexin.study2;public class LCS {public static void main(String[] args) {// 设置字符串长度int sublen1 = 5;int sublen2 = 6;// 随机生成字符串String str1 = "((ad)";String str2 = "(a((d)";//二位数组描述矩阵int[][] c = new int[sublen1 + 1][sublen2 + 1];// 动态规划计算所有子问题for (int i = sublen1 - 1; i >= 0; i--) {for (int j = sublen2 - 1; j >= 0; j--) {if (str1.charAt(i) == str2.charAt(j))c[i][j] = c[i + 1][j + 1] + 1;elsec[i][j] = Math.max(c[i + 1][j], c[i][j + 1]);}}System.out.println("str1:" + str1);System.out.println("str2:" + str2);System.out.print("LCS:");int i = 0, j = 0;while (i < sublen1 && j < sublen2) {if (str1.charAt(i) == str2.charAt(j)) {System.out.print(str1.charAt(i));i++;j++;} else if (c[i + 1][j] >= c[i][j + 1])i++;elsej++;}}}
0 0
- Java——最长公共子串问题LCS
- 最长公共子序列问题——LCS
- 动态规划——最长公共子序列问题(LCS)
- lCS——最长公共子序列
- 最长公共子序列——LCS
- java专题——LCS最长子串问题
- 字符串、动态规划——最长公共子串LCS
- LCS:最长公共子串
- 最长公共子串LCS
- LCS最长公共子串
- 最长公共子串LCS
- 最长公共子串(LCS)
- 求两个字符串最长公共子串(LCS问题)
- LCS问题及拓展:最长公共子序列和最长公共子串
- 最长公共子序列问题LCS
- 最长公共子序列(LCS)问题
- LCS最长公共子序列问题
- 最长公共子序列(LCS)问题
- 第三章:Dubbo整合maven+spring+springmvc+mybatis之服务消费搭建
- oc4j(oracle container for j2EE)使用笔记一
- 网上大篇幅的坑人的struts2入门案例
- eclipse配置tomcat,访问http://localhost:8080出现404错误
- java基础知识要点总结之几个重要关键字(关于static、this、final、)
- Java——最长公共子串问题LCS
- 图像处理,从现在开始。
- 微信公众号如何实现宠物店服务微信在线预约
- node eventEmitter
- 科大讯飞面试,一把泪。
- 寻找知识区的盲点
- JSTL核心标签库学习(一)
- Servlet(5)Servlet概念和servlet接口实现(学习Servlet生命周期函数)servlet的实例及其网络拓扑图
- spring mvc 学习(一)