Java最长公共子序列示例源码

网友投稿 515 2023-04-05


Java最长公共子序列示例源码

最长公共子序列(Longest Common Subsequence)定义:两个或多个已知数列的子序列集合中最长的就是最长公共子序列。其实说到最长公共子序列,还有一个要提到的是最长公共子串(Longest Common Substring),它指的是两个字符串中的最长公共子串,要求子串一定连续。关于最长公共子串的内容我们后续也会讲到,今天先来看下最长公共子序列的相关内容。

之前看过一个LCS算法的实现过程,觉得太过繁琐。自己写了一个比较简单的,此处仅仅介绍实现过程。

程序代码测试通过,需要的童鞋可以在这里拷贝一下,代码如下:

package com.wsy.dynamic;

import java.util.HashMap;

import java.util.Map;

public class ImpLCS {

public String getLCS(String str1, String str2, int n, int m){

validate(str1, str2);

char[] a = str1.toCharArray();

char[] b = str2.toCharArray();

int[][] c = new int[n+1][m+1];

//存放序列

Map map = new HashMap();

//初始化参数

for(int i = 0;i<=n;i++){

c[i][0] = 0;

map.put(i + "0", "");

}

for(int i = 0;i<=m;i++){

c[0][m] = 0;

map.put("0" + i, "");

}

for(int i = 1;i<=n;i++){

for(int j = 1;j<=m;j++){

if(a[i-1] == b[j-1]){

c[i][j] = c[i-1][j-1] + 1;

String tmp = map.get(changeNum(i-1,j-1));

map.put(changeNum(i,j), tmp + String.valueOf(a[i-1]));

}else{

if(c[i][j-1] > c[i-1][j]){

c[i][j] = c[i][j-1];

String tmp = map.get(changeNum(i,j-1));

map.put(changeNum(i,j), tmp);

}else{

c[i][j] = c[i-1][j];

String tmp = map.get(changeNum(i-1,j));

map.put(changeNum(i,j), tmp);

}

}

}

}

String key = changeNum(n,m);

return map.get(key);

}

/**

* 将数字拼接成字符串

* @param i

* @param j

* @return

*/

private String changeNum(int i, int j) {

StringBuilder sb = new StringBuilder(String.valueOf(i));

return sb.append(j).toString();

}

/**

* 验证参数

* @param str1

* @param str2

*/

private void validate(String str1, String str2) {

// 略

}

public static void main(String[] args) {

ImpLCS lcs = new ImpLCS();

String rs = lcs.getLCS("12345", "12334", 5, 4);

System.out.println("---:" + rs);

}

}

总结

以上是本文的全部内容,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感http://谢大家对我们网站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:67 个节约开发时间的前端开发者的工具、库和资源
下一篇:Angular 4.0学习教程之架构详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~