动态规划之----求两个字符串的最长公共子序列

package DongtaiGuihua;

/** * Created by hunk on 2015/9/13. */public class LongestCommonSubstring {

    public static void main(String[] args){        String str1="BDCABA";        String str2="ABCBDAB";        System.out.println(findMaxCommonSubstring(str1,str2,str1.length()-1,str2.length()-1));        System.out.println(findMaxCommonSubstring2(str1,str2));    }

    public static int findMaxCommonSubstring(String str1,String str2,int i,int j){//获取最大非连续公共子串长度,递归        if(i==-1 ||j==-1){            return 0;        }        if (str1.charAt(i)==str2.charAt(j)){            return findMaxCommonSubstring(str1,str2,i-1,j-1)+1;        }else {            return Math.max(findMaxCommonSubstring(str1,str2,i,j-1),findMaxCommonSubstring(str1,str2,i-1,j));        }    }

    public static int findMaxCommonSubstring2(String str1,String str2){//非递归        int str1Len=str1.length();        int str2Len=str2.length();        int[][] len= new int[str1Len+1][str2Len+1];        for(int i=0;i<=str2Len;i++){            len[0][i]=0;        }        for(int j=0;j<str1Len;j++){            len[j][0]=0;        }        for(int i=1;i<=str1.length();i++){//状态迁移方程            for(int j=1;j<=str2.length();j++){                if (str1.charAt(i-1)==str2.charAt(j-1)){                    len[i][j]=len[i-1][j-1]+1;                }else if (len[i-1][j]>=len[i][j-1]){                    len[i][j]=len[i-1][j];                }else {                    len[i][j]=len[i][j-1];                }            }        }

        for(int i=0;i<=str1Len;i++){//打印状态矩阵            for(int j=0;j<=str2Len;j++){                System.out.print(len[i][j]+" ");            }            System.out.println();        }        int i=1,j=1;        while (i<=str1Len&&j<=str2Len){//输出序列                if(str1.charAt(i-1)==str2.charAt(j-1)){                    System.out.print(str1.charAt(i-1));                    i++;                    j++;                }else if (j+1>str2Len&&i+1<=str1Len){                    i++;                }else if (i+1>str1Len&&j+1<=str2Len){                    j++;                }else if(len[i+1][j]>len[i][j+1]){                    i++;                }else {                    j++;                }            }        System.out.println();        return len[str1Len][str2Len];    }}
时间: 2024-12-16 11:33:15

动态规划之----求两个字符串的最长公共子序列的相关文章

算法导论中如何求两个字符串的最长公共子序列

#include<iostream> #include<string> using namespace std; const int max_length=10; void print(int b[max_length][max_length],string X,int i,int j); void LCS(string X,string Y,int b[max_length][max_length],int m,int n ) { int **c=new int*[m+1]; f

c++求两个字符串的最长公共子序列and子串

https://blog.csdn.net/ggdhs/article/details/90713154 #include <iostream> using namespace std; int main() { char str1[] = "helloworld"; char str2[] = "loop"; int arr[11][5] = {0}; for(uint32_t i=1; i<11;i++) { cout << str

求两个字符串的最长公共子串——Java实现

要求:求两个字符串的最长公共子串,如"abcdefg"和"adefgwgeweg"的最长公共子串为"defg"(子串必须是连续的) public class Main03{ // 求解两个字符号的最长公共子串 public static String maxSubstring(String strOne, String strTwo){ // 参数检查 if(strOne==null || strTwo == null){ return null

求解两个字符串的最长公共子序列

一,问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB 则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA 二,算法求解 这是一个动态规划的题目.对于可用动态规划求解的问题,一般有两个特征:①最优子结构:②重叠子问题 ①最优子结构 设 X=(x1,x2,.....xn) 和 Y={y1,y2,.....ym} 是两个序列,将 X 和 Y 的最长公共子序列记为LCS(X,

求三个字符串的最长公共子序列LCS(A,B,C)

LCS(A,B,C)!=LCS(A,LCS(B,C)) 反例: abcd abcde abced LCS(B,C)求出来可能是abce或者abcd dp[i][j][k]表示A[0...i],B[0...j],C[0...k]的LCS 转移方程: if (a[i]==b[j]&&b[j]==c[k]) dp[i][j][k]=dp[i-1][j-1][k-1]+1; else dp[i][j][k]=max(max(dp[i][j][k], dp[i-1][j][k]), max(dp[i

动态规划求两个序列的最长公共子序列

摘录:http://blog.chinaunix.net/uid-26548237-id-3374211.html 1.序列str1和序列str2 ·长度分别为m和n: ·创建1个二维数组L[m.n]: ·初始化L数组内容为0 ·m和n分别从0开始,m++,n++循环: - 如果str1[m] == str2[n],则L[m,n] = L[m - 1, n -1] + 1: - 如果str1[m] != str2[n],则L[m,n] = max{L[m,n - 1],L[m - 1, n]}

[URAL-1517][求两个字符串的最长公共子串]

Freedom of Choice URAL - 1517 Background Before Albanian people could bear with the freedom of speech (this story is fully described in the problem "Freedom of speech"), another freedom - the freedom of choice - came down on them. In the near fu

【java】求两个字符串的最长公共子串

这个是华为OJ上的一道题目.首先,如果我们用java写代码,华为OJ有以下三条规则需遵守,否则编译无法通过或者用例无法通过,规则如下: (1)一定不可以有包名: (2)主类名只能为Main: (3)不可以输出与结果无关的信息. 好了,按照以上规则,我们写出来的代码如下(此代码不是最优的,只是用来记录华为OJ上java代码的书写规则): import java.util.Scanner; public class Main { public static void main(String[] ar

求两个字符串的最长公共子串

public static String findLongestOfTheSame(String s1,String s2) { char[] c1=s1.toCharArray(); char[] c2=s2.toCharArray(); int l1=c1.length; int l2=c2.length; int count=0,maxLength=0,start=0,end=0; boolean hasTheSame=false; for(int i=0;i<l1;i++) { coun