最长公共子序列LCS(The longest common subsequence)
2016-05-07 19:31
169 查看
最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。而最长公共子串(要求连续)和最长公共子序列是不同的.
最长公共子序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,这种方法判断修改的部分,往往十分准确。简而言之,百度知道、百度百科都用得上。
最长公共子序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,这种方法判断修改的部分,往往十分准确。简而言之,百度知道、百度百科都用得上。
#include<bits/stdc++.h> using namespace std; string s1,s2; int dp[1005][1005]; //第一个字符串中的前i个位置与第二个字符串中的前j个位置构成的最长长度 //状态转移方程 //dp[i][j]=dp[i-1][j-1]+1 (s1[i]==s2[j]) //dp[i][j]=max(dp[i-1][j],dp[i][j-1]) (s1[i]!=s2[j]) int main() { cin>>s1>>s2; memset(dp,0,sizeof(dp)); for(int i=1; i<=s1.size(); i++) { for(int j=1; j<=s2.size(); j++) { if(s1[i]==s2[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } cout<<dp[s1.size()][s2.size()]<<endl; for(int i=s1.size(),j=s2.size();i>=1&&j>=1;){//反向输出路径 if(s1[i-1]==s2[j-1]){ cout<<s1[i-1]<<" "; i--;j--; } else { if(dp[i-1][j]<dp[i][j-1]) j--; else i--; } } return 0; }其实更多的是计算长度,正常使用这样已经够用了
相关文章推荐
- 【UNET自学日志】Part20 UI
- 关键字提取工具(面向英文)
- 最长上升子序列LIS(Longest Increasing Subsequence)
- mysql5中大数据错误:Packet for query is too large (***>***). You can change this value on the ser
- mysql 5.5 开启慢日志slow log的方法(log_slow_queries)
- MySQL开启慢查询日志log-slow-queries的方法
- 蓝牙(Bluetooth)
- Servlet中使用RequestDispatcher调派请求--forware
- Android Volley完全解析(三),定制自己的Request
- 2016 UESTC ACM Summer Training Team Selection (2)解题报告
- System and Device Programming------questions solved about device
- HDU 1711 Number Sequence (KMP)
- Servlet中使用RequestDispatcher调派请求--include
- 【转】SVN的UUID错误
- Java ArrayDeque源码剖析
- Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor
- iOS UISearchController使用
- UGUI 实现屏幕外怪物的指示箭头
- 自从我整理好了它?UI在也不敢说咋们程序员没审美!
- 【SSH网上商城项目实战04】EasyUI菜单的实现