字符串的相似性:如果将一个串转换成为另一个串所需的操作数最少,那么可以说这两个串是相似的。另外一种权衡的方法是,寻换第三个串s3,如果s3都出现在s1和s2中,且出现的顺序相同,但不要求在s1和s2中连续,那么s3的长度越大,就说明相似度越高。
后一种对相似度概念命名为最长公共子序列。
1、最长公共子序列的特征
如果用暴力搜索的方法求解LCS问题,就要穷举X的所有子序列,对每个子序列进行检查,看它是否是Y的子序列,记录找到的最长的子序列。X对应下标人格集合{1,2,3……m}的一个子集,那么X的子序列就有2^m个。
但其实LCS是具有最优子结构的:
令X={x1,x2,x3……xm}, Y={y1,y2,y3……yn}。Z={z1,z2,z3……zk}为X和Y的任意LCS.则有:
(1)如果xm=yn, 则zk = xm = yn,且Zk-1是Xm-1与Yn-1的LCS.
(2)如果xm!=yn,则zk!=xm意味着Zk-1是Xm-1与Y的LCS
(3)如果xm!=yn,则zk!=yn意味着Zk-1是Yn-1与X的LCS
2、递归解
用dp[i][j]表示Xi与Yj的LCS的长度。
dp[i][j] = 0 if i = 0 or j =0
dp[i][j] = dp[i-1][j-1] +1 if xi = yj
dp[i][j] = max(dp[i-1][j], dp[i][j-1]) if x1!=yj
代码如下:
- // LCS.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <string.h>
- #include <iostream>
- using namespace std;
- #define MaxLength 100
- int max(int a,int b)
- {
- return a>=b?a:b;
- }