最长子序列问题
子序列定义
可以注意到,子序列不要求所选的字母连续,只要求是按原次序组成就好
这是和子串的一个区别
##最长公共子序列定义
最长公共子序列(L ongest C ommon S equence)
简称为LCS,下同
直观明了,就是两个序列的共有的子序列中最长的一个,
此图里就是 DATA这一个单词
#解法
##1. 暴力法
首先我们想到的便是把两个序列的所有可能的子序列枚举出来,一一进行比较.
所有一个序列的子序列的组合有 ** 2 n 2^n 2n**种可能,而且需要m次比较.
所以时间复杂度是O( m ∗ 2 n m*2^n m∗2n),空间复杂度是O(2^n);
显然出现了 指数形式的复杂度,这是在时间和空间上无法接受的.
##2 递归
对于序列A[0,N] 和A[0,M];
他们的最长自序列LCS(A,B)有三种情况
①. 最后一个字母相等,直接将其剔除
②.末子符不等
这有点不好理解,其实在开始递归时 ,程序并不知道谁能取得更大的字串,
所以将分别对应的两种情况都进行递归直到递归出口,(相当于将每种情况都走完)
之后把所有的情况每次都层层返回,
每次返回都进行一次比较,总是取最大的返回值,这样就得到了更长者
③.递归出口
当序列为空的时候,返回0;
总结下来就是如下公式
根据这个公式很容易得出递归版的代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
char a[30], b[30];
int a_len, lenb;
int LCS(int, int);