`
GongQi
  • 浏览: 101074 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

字符串最大公共子序列以及最大公共子串问题

 
阅读更多
最大公共子序列
import java.util.Random;
public class LCS {

	public static void main(String[] args){

        //设置字符串长度
        int substringLength1 = 20;
        int substringLength2 = 20;  //具体大小可自行设置

        // 随机生成字符串
        String x = GetRandomStrings(substringLength1);
        String y = GetRandomStrings(substringLength2);
        // 构造二维数组记录子问题x[i]和y[i]的LCS的长度
        int[][] opt = new int[substringLength1 + 1][substringLength2 + 1];

        // 从后向前,动态规划计算所有子问题。也可从前到后。
        for (int i = substringLength1 - 1; i >= 0; i--){
            for (int j = substringLength2 - 1; j >= 0; j--){
               if (x.charAt(i) == y.charAt(j))
                   opt[i][j] = opt[i + 1][j + 1] + 1;//状态转移方程                                 
                else
                    opt[i][j] = Math.max(opt[i + 1][j], opt[i][j + 1]);//状态转移方程       
            }
        }
        System.out.println("substring1:"+x);
        System.out.println("substring2:"+y);
        System.out.print("LCS:");

        int i = 0, j = 0;
        while (i < substringLength1 && j < substringLength2){
            if (x.charAt(i) == y.charAt(j)){
                System.out.print(x.charAt(i));
                i++;
                j++;
            } else if (opt[i + 1][j] >= opt[i][j + 1])
                i++;
            else
                j++;
        }
    }

    //取得定长随机字符串
    public static String GetRandomStrings(int length){
        StringBuffer buffer = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
        StringBuffer sb = new StringBuffer();
        Random r = new Random();
        int range = buffer.length();
        for (int i = 0; i < length; i++){
            sb.append(buffer.charAt(r.nextInt(range)));
        }
        return sb.toString();
    }    
}

最大公共子串
public static void lcs2(){
        String x="abcdepoi";
        String y="bcdefpoi";
    	int substringLength1 = x.length();
        int substringLength2 = y.length(); 
        int opt[][]=new int [substringLength1+1][substringLength2+1];
        for(int i=1;i<=substringLength1;i++)
        	for(int j=1;j<=substringLength2;j++)
        	{
        		if(x.charAt(i-1)==y.charAt(j-1))
        			opt[i][j]=opt[i-1][j-1]+1;//状态转移方程,
        	}
        int max=opt[0][0];
        int m=0,n=0;
        for(int i=substringLength1;i>=1;i--)
        	for(int j=substringLength2;j>=1;j--){
        		if(opt[i][j]>max)
        			{
        				max=opt[i][j];
        				m=i;
        				n=j;
        			}
        	}
        System.out.println("x = "+x);
        System.out.println("y = "+y);
        System.out.println("max = "+max);
        StringBuffer sb=new StringBuffer();
        for(int i=m,j=n;i>=1&&j>=1;i--,j--)
    		{
        		if(opt[i][j]>0)
        			sb.append(x.charAt(i-1));
    		}
        String result=sb.toString();
        for(int i=result.length()-1;i>=0;i--)
        	System.out.print(result.charAt(i));
    }
0
2
分享到:
评论

相关推荐

    求解最大子序列、最长递增子序列、最长公共子串、最长公共子序列

    求解最大子序列、最长递增子序列、最长公共子串、最长公共子序列. http://blog.csdn.net/ssuchange/article/details/17341693

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

    本文实例讲述了C语言求两个字符串的最长公共子串的方法。分享给大家供大家参考。具体实现方法如下: #include "stdio.h" #include "string.h" #include "stdlib.h" void getCommon(char str1[],char str2[],char * ...

    Python求两个字符串最长公共子序列代码实例

    主要介绍了Python求两个字符串最长公共子序列代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    最大公共子序列的c++实现

    问题描述 ...给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB 则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA

    面试必考字符串相关的动态规划——最大公共子序列、最大公共子串、编辑距离

    字符串相关的动态规划最大公共子序列最大公共子串编辑距离 简述这三个算法解决的问题和展示状态转移方程并且给出可通过执行的Python代码。 最大公共子序列 子序列是,一个字符串中的任意字符组成的序列,重点在于,...

    C语言求解最长公共子字符串问题及相关的算法分析

    请编写一个函数,输入两个字符串,求它们的最长公共子序列,并打印出最长公共子序列。 例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子序列,则输出它们的长度4,并打印任意一个子...

    最长公共子序列c#学习案例(完整版)含Excel数据分析

    测试文字录入内容,常用的处理方法是关键字检测发,通过检测word文件中的关键字,可以测出考生操作的大概结果,但是很不准确,利用最长公共子序列算法进行文字录入测试,可以很好的解决这一问题。

    最长公共子序列及杭电1394的求解

    最长公共子序列及杭电1394的求解 求解字符串公共子串的问题

    最长公共子序列

    如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。...本资源编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。

    详解Python最长公共子串和最长公共子序列的实现

    LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置...

    利用C++实现最长公共子序列与最长公共子串

    主要给大家介绍了如何利用C++实现最长公共子序列与最长公共子串,文章一开始就给大家简单的介绍了什么是子序列,子串应该比较好理解就不用多介绍了,人后通过算法及示例代码详细介绍了C++实现的方法,有需要的朋友们...

    深入解析最长公共子串

    例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。 分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题...

    Python实现查找字符串数组最长公共前缀示例

    主要介绍了Python实现查找字符串数组最长公共前缀,涉及Python针对字符串的遍历、判断、计算等相关操作技巧,需要的朋友可以参考下

    PHP实现求解最长公共子串问题的方法

    主要介绍了PHP实现求解最长公共子串问题的方法,简单描述了求解最长公共子串问题算法原理,并结合实例形式分析了PHP实现求解最长公共子串的具体操作技巧,需要的朋友可以参考下

    最长公共子序列问题.zip

    常见的动态规划问题包括背包问题、最长递增子序列、编辑距离等。 贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符...

    最长公共子序列:给出两串之间最长的公共子串。-matlab开发

    %%%输入%%%X, Y - 都是字符串,例如 'test' 或 'stingtocompare' %%%输出%%%D 是最短字符串长度上的子字符串%%%dist 是子串的长度%%%aLongestString 是一个长度为 dist 的字符串(可能只有一个)

    lcs.rar_ateh8z_lcs问题_最长公共子序列;动态规划;计算生物学;

    LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置...

    zpengc#seu_monash_algorithm-design-and-analysis#1022 最长公共子序列1

    //最长公共序列和最长公共子串不是一个问题// longest common sequence// dp[i][j]表示长度为i的字符串和长度为j的字符串的lc

    dp解最长公共连续子序列

    注意这里是连续的子串。算法导论的动态规划部分讲了字符串最长公共子串的解法,但是那个子串是可以不连续的

Global site tag (gtag.js) - Google Analytics