数据结构基础 字符串相似度与最长公共子序列

本文探讨了如何通过最长公共子序列(LCS)来衡量字符串的相似度。LCS问题具有最优子结构,可以通过动态规划求解。此外,还介绍了计算字符串相似度的算法,涉及修改、增加和删除字符的操作,并给出了相应的动态规划解决方案。
摘要由CSDN通过智能技术生成

         字符串的相似性:如果将一个串转换成为另一个串所需的操作数最少,那么可以说这两个串是相似的。另外一种权衡的方法是,寻换第三个串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

 

     代码如下:

[cpp]  view plain  copy
  1. // LCS.cpp : Defines the entry point for the console application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <string.h>  
  6. #include <iostream>  
  7.   
  8. using namespace std;  
  9.   
  10. #define MaxLength 100  
  11.   
  12. int max(int a,int b)  
  13. {  
  14.     return a>=b?a:b;  
  15. }  
  16.   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值