首页 > 开发 > Java > 正文

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

2024-07-13 10:12:02
字体:
来源:转载
供稿:网友

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

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

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

java;">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<String,String> map = new HashMap<String,String>();  //初始化参数  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); }}

总结

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


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表