最大公共子序列
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));
}
分享到:
相关推荐
求解最大子序列、最长递增子序列、最长公共子串、最长公共子序列. http://blog.csdn.net/ssuchange/article/details/17341693
本文实例讲述了C语言求两个字符串的最长公共子串的方法。分享给大家供大家参考。具体实现方法如下: #include "stdio.h" #include "string.h" #include "stdlib.h" void getCommon(char str1[],char str2[],char * ...
主要介绍了Python求两个字符串最长公共子序列代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
问题描述 ...给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB 则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA
字符串相关的动态规划最大公共子序列最大公共子串编辑距离 简述这三个算法解决的问题和展示状态转移方程并且给出可通过执行的Python代码。 最大公共子序列 子序列是,一个字符串中的任意字符组成的序列,重点在于,...
请编写一个函数,输入两个字符串,求它们的最长公共子序列,并打印出最长公共子序列。 例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子序列,则输出它们的长度4,并打印任意一个子...
测试文字录入内容,常用的处理方法是关键字检测发,通过检测word文件中的关键字,可以测出考生操作的大概结果,但是很不准确,利用最长公共子序列算法进行文字录入测试,可以很好的解决这一问题。
最长公共子序列及杭电1394的求解 求解字符串公共子串的问题
如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。...本资源编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。
LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置...
主要给大家介绍了如何利用C++实现最长公共子序列与最长公共子串,文章一开始就给大家简单的介绍了什么是子序列,子串应该比较好理解就不用多介绍了,人后通过算法及示例代码详细介绍了C++实现的方法,有需要的朋友们...
例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。 分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题...
主要介绍了Python实现查找字符串数组最长公共前缀,涉及Python针对字符串的遍历、判断、计算等相关操作技巧,需要的朋友可以参考下
主要介绍了PHP实现求解最长公共子串问题的方法,简单描述了求解最长公共子串问题算法原理,并结合实例形式分析了PHP实现求解最长公共子串的具体操作技巧,需要的朋友可以参考下
%%%输入%%%X, Y - 都是字符串,例如 'test' 或 'stingtocompare' %%%输出%%%D 是最短字符串长度上的子字符串%%%dist 是子串的长度%%%aLongestString 是一个长度为 dist 的字符串(可能只有一个)
LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置...
//最长公共序列和最长公共子串不是一个问题// longest common sequence// dp[i][j]表示长度为i的字符串和长度为j的字符串的lc
注意这里是连续的子串。算法导论的动态规划部分讲了字符串最长公共子串的解法,但是那个子串是可以不连续的
最长公共子序列 - 断字问题- 组合总和 - 房屋强盗 - 房屋强盗 II - 解码方式 - 独特的路径 - 跳跃游戏—— 图形 克隆图 - 课程安排 - 太平洋大西洋水流 - 岛屿数量 - 最长连续序列 - 外星人词典 (Leetcode Premium) ...