LCS最长子串问题

方法一:动态规划 效率O(mn)(mn是分别是两个字符串的长度)

#include<iostream>
using namespace std;

int c[100][100];//全局变量自动初始化为0
inline int max(int a, int b)
{
	return (a > b ? a : b);
}

int LCS(const char *X,const char *Y)
{
	if (NULL == X || NULL == Y)
		return 0;
	int xlen = strlen(X);
	int ylen = strlen(Y);
	for (int i = 1; i <= xlen; i++)
	{
		for (int j = 1; j <= ylen; j++)
		{
			if (X[i] == Y[j])
				c[i][j] = c[i - 1][j - 1] + 1;
			else
				c[i][j] = max(c[i][j - 1], c[i - 1][j]);
		}
	}
	return c[xlen][ylen];
}
int main()
{
	char A[8] = "ABCBDAB";
	char B[8] = "BDCABAB";
	cout << LCS(A, B) << endl;
	system("pause");
	return 0;
}

方法二:低效的递归算法

#define INF 9999999
int c[100][100];
int LCS_Memo(const char* X, const char* Y,int i,int j)
{
	if (c[i][j] < INF)
		return c[i][j];
	if (0 == i || 0 == j)
		c[i][j] = 0;
	else if (X[i - 1] == Y[j - 1])
		c[i][j] = LCS_Memo(X,Y,i - 1, j - 1) + 1;
	else
	{
		int p = LCS_Memo(X, Y, i - 1, j);
		int q = LCS_Memo(X, Y, i, j - 1);
		if (p >q)
			c[i][j] = p;
		else
		{
			c[i][j] = q;
		}
	}
	return c[i][j];
}
int LCS(const char* X ,const char* Y)
{
	if (NULL == X || NULL == Y)
		return 0;
	int xlen = strlen(X);
	int ylen = strlen(Y);
	memset(c, INF, sizeof(c));//注意是将每个字节赋值为INF,不是一个int

	return LCS_Memo(X, Y, xlen, ylen);
}
int main()
{
	char A[8] = "ABCBDAB";
	char B[8] = "BDCABAB";
	cout << LCS(A, B) << endl;
	system("pause");
	return 0;
}
时间: 2024-10-15 09:39:21

LCS最长子串问题的相关文章

UVa 10192 - Vacation ( LCS 最长公共子串)

链接:UVa 10192 题意:给定两个字符串,求最长公共子串的长度 思路:这个事最长公共子串的直接应用 #include<stdio.h> #include<string.h> int max(int a,int b) { return a>b?a:b; } int main() { char s[105],t[105]; int i,j,k=0,m,n,dp[105][105]; while(gets(s)!=NULL){ if(strcmp(s,"#"

算法设计 - LCS 最长公共子序列&amp;&amp;最长公共子串 &amp;&amp;LIS 最长递增子序列

出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的最长公共子串方法.最长公共子串用动态规划可实现O(n^2)的时间复杂度,O(n^2)的空间复杂度:还可以进一步优化,用后缀数组的方法优化成线性时间O(nlogn):空间也可以用其他方法优化成线性.3.LIS(最长递增序列)DP方法可实现O(n^2)的时间复杂度,进一步优化最佳可达到O(nlogn)

Java 最长子序列和最长子串

最长子序列:匹配的字符不需要连续. 最长子串: 匹配的字符需要连续,可能有多种结果. 解决思路:将输入字符串1看作行, 输入字符串2看作列,构成二位数组,然后将对角线匹配字符的值标记为1,计算满足条件的匹配字符个数即可. 基本思想: 空间换时间,动态规划. 图解与公式(只针对最长子序列,最长子串类似) 状态转移方程 直观版: 最长子序列 1 /** 2 * find longest common sequence from two input string 3 * @param s1 4 * @

LCS 最长公共子序列(DP经典问题)

最长公共子序列问题以及背包问题都是DP(动态规划)算法的经典题目,值得深度挖掘以致了解DP算法思想.问题如下: 最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最

最长子串(FZU2128)

最长子串 Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice FZU 2128 Description 问题很简单,给你一个字符串s,问s的子串中不包含s1,s2...sn的最长串有多长. Input 输入包含多组数据.第一行为字符串s,字符串s的长度1到10^6次方,第二行是字符串s不能包含的子串个数n,n<=1000.接下来n行字符串,长度不

Leetcode3---&gt;无重复字符的最长子串长度

题目:给定一个字符串string,找出string中无重复字符的最长子串. 举例: Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with the length of 1. Given "pwwkew", the answer is "wke"

Problem 2128 最长子串(kmp+strstr好题经典)

 Problem 2128 最长子串 Accept: 134    Submit: 523Time Limit: 3000 mSec    Memory Limit : 65536 KB  Problem Description 问题很简单,给你一个字符串s,问s的子串中不包含s1,s2...sn的最长串有多长.  Input 输入包含多组数据.第一行为字符串s,字符串s的长度1到10^6次方,第二行是字符串s不能包含的子串个数n,n<=1000.接下来n行字符串,长度不大于100. 字符串由小

LeetCode 记录之求最长子串

//the basic idea is, keep a hashmap which stores the characters in string as keys and their positions as values, and keep two pointers which define the max substring. move the right pointer to scan through the string , and meanwhile update the hashma

LeetCode: 3_Longest Substring Without Repeating Characters | 求没有重复字符的最长子串的长度 | Medium

题目: Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest s