最长公共子序列&&最长公共子串
2016-08-16 20:16
155 查看
概念
前提:都是有2个字符串最长公共子串:子串要求在原字符串中是连续的
最长公共子序列:子串要求在原字符串中不要求连续
最长公共子串
最长公共子串为最长公共子序列的子问题,要求下标序列是递增的,且每次递增的增量为1。采用动态规划解题时,主要体现在状态转移函数的不同。package com.xianggen.algorithm; import java.util.Scanner; /** * 最长公共子串 * @author xianggen * @date 2016年8月21日 上午12:09:26 */ public class LCStr { public static void main(String[] args) { String str1,str2; Scanner scan=new Scanner(System.in); while(scan.hasNext()){ str1=scan.nextLine(); str2=scan.nextLine(); String lcStr=lscStr(str1,str2); System.out.println(lcStr); } scan.close(); } /** * * @param str1 * @param str2 * @return */ public static String lscStr(String str1,String str2){ int len1,len2,maxLen=-1; len1=str1.length(); len2=str2.length(); int x=0,y=0; int[][] state=new int[len1+1][len2+1]; //第一个字符串,将第一列全置0,见图 for(int i=0;i<len1+1;i++) state[i][0]=0; //第二个字符串,将第一行全置0 for(int j=0;j<len2+1;j++) state[0][j]=0; for(int i=1;i<len1+1;i++){ for(int j=1;j<len2+1;j++){ if(str1.charAt(i-1)==str2.charAt(j-1)) state[i][j]=state[i-1][j-1]+1; else state[i][j]=0; if(state[i][j]>maxLen){ maxLen=state[i][j]; x=i; y=j; } } } int i=x-1,j=y-1; while(i>=0&&j>=0){ if(str1.charAt(i)==str2.charAt(j)){ i--; j--; }else break; } String commonStr=str1.substring(i+1,x); return commonStr; } }
最长公共子序列
Longest Common Subsequence, LCS引入状态转移方程:
/** * * @param str1 * @param str2 * @return */ public static String lscStr(String str1,String str2){ int len1,len2,maxLen=-1; len1=str1.length(); len2=str2.length(); int[][] state=new int[len1+1][len2+1]; //第一个字符串,将第一列全置0,见图 for(int i=0;i<len1+1;i++) state[i][0]=0; //第二个字符串,将第一行全置0 for(int j=0;j<len2+1;j++) state[0][j]=0; for(int i=1;i<len1+1;i++){ for(int j=1;j<len2+1;j++){ if(str1.charAt(i-1)==str2.charAt(j-1)) state[i][j]=state[i-1][j-1]+1; //上边值大于左边值 else if(state[i-1][j]>state[i][j-1]) state[i][j]=state[i-1][j]; else state[i][j]=state[i][j-1]; if(state[i][j]>maxLen) maxLen=state[i][j]; } } System.out.println("maxLen="+maxLen); System.out.println("输出公共子序列:"); int i=len1,j=len2,k; k=state[len1][len2]; char[] result=new char[k]; while(i>0&&j>0){ if(str1.charAt(i-1)==str2.charAt(j-1)){ result[--k]=str1.charAt(i-1); i--; j--; }else if(state[i-1][j]<state[i][j-1]) j--; else i--; } String commonStr=String.valueOf(result); return commonStr; }
相关文章推荐
- 动态规划之最长公共子序列&最长公共子串
- 最长递增子序列&&最长公共子序列&&最长公共子串
- 最长公共子序列&最长公共子串
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
- 最长公共子序列&最长公共子串
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
- 算法题9 动态规划之最长公共子序列&amp;最长公共子串
- 最长公共子序列&&最长公共子串---[动态规划]
- 最长公共子串 & 最长公共子序列
- UVa 10192 - Vacation & UVa 10066 The Twin Towers ( LCS 最长公共子串)
- java 动态规划求解最长公共子序列&最长公共子串问题
- 美团2017编程题—拼凑钱币&大富翁游戏&最大矩形面积&最长公共连续子串
- UVa 10192 - Vacation & UVa 10066 The Twin Towers ( LCS 最长公共子串)
- 《算法导论》读书笔记之动态规划—最长公共子序列 & 最长公共子串(LCS)
- 文本相似度计算之--- 编辑距离 && 最长公共子串
- 算法12—动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
- 动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
- hdu1403 && poj 2774 最长公共子串 后缀数组
- 华为OJ 公共字串计算&&查找两个字符串a,b中的最长公共子串
- 面试(动态规划算法之:最长公共子序列 & 最长公共子串(LCS))