LCS 算法实现
动态规划算法
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std; #define MAXSTRLEN 20 int Lcs(char x[], char y[], int path[][MAXSTRLEN])//求序列x和y的最长公共子序列,path保存路径指向,以方便打印公共子序列
{
int i, j;
int len1=strlen(x)-;
int len2=strlen(y)-; int **c=new int*[len1+];
for(i=; i<=len1; i++)
c[i]=new int[len2+]; for(i=; i<=len1; i++)
c[i][]=;
for(i=; i<=len2; i++)
c[][i]=;
for(i=; i<=len1; i++)
for(j=; j<=len2; j++)//从x[1],y[1]开始
{
if(x[i]==y[j])
{
c[i][j]=c[i-][j-]+;
path[i][j]=;
}
else if(c[i-][j]>=c[i][j-])
{
c[i][j]=c[i-][j];
path[i][j]=;
}
else
{
c[i][j]=c[i][j-];
path[i][j]=;
}
} return c[len1][len2];
} void PrintLcs(int i, int j, char x[], int path[][MAXSTRLEN])//打印最长公共子序列
{
if(i== || j==)
return; if(path[i][j]==)
{
PrintLcs(i-, j-, x, path);
cout<<x[i];
}
else if(path[i][j]==)
PrintLcs(i-, j, x, path);
else
PrintLcs(i, j-, x, path); }
void main()
{
char a[MAXSTRLEN];
char b[MAXSTRLEN];
int path[MAXSTRLEN][MAXSTRLEN];
gets(a+);//a[0]不算,从a[1]开始
gets(b+);//b[0]不算,从b[1]开始 cout<<Lcs(a, b, path)<<endl;
cout<<"最长公共子序列:";
PrintLcs(strlen(a)-, strlen(b)-, a, path);
cout<<endl; }
递归算法
#include <iostream>
using namespace std; #define MAXSTRLEN 20 //递归算法
int Lcs(char *str1, char *str2)
{
if(*str1=='\0' || *str2=='\0')
return ;
if(*str1==*str2)
return Lcs(str1+, str2+)+;
else if(Lcs(str1+, str2)>Lcs(str1, str2+))
return Lcs(str1+, str2);
else
return Lcs(str1, str2+); } void main()
{
char a[MAXSTRLEN];
char b[MAXSTRLEN]; gets(a);
gets(b);
cout<<Lcs(a, b)<<endl; }
LCS 算法实现的更多相关文章
- LCS算法
转自:http://hzzy-010.blog.163.com/blog/static/79692381200872024242126/ 好详细~~~也十分好理解~~~ 最长公共子序列问题(非连续的 ...
- O(nlogn)LIS及LCS算法
morestep学长出题,考验我们,第二题裸题但是数据范围令人无奈,考试失利之后,刻意去学习了下优化的算法 一.O(nlogn)的LIS(最长上升子序列) 设当前已经求出的最长上升子序列长度为len. ...
- Levenshtein Distance + LCS 算法计算两个字符串的相似度
//LD最短编辑路径算法 public static int LevenshteinDistance(string source, string target) { int cell = source ...
- 对LCS算法及其变种的初步研究
LCS的全称为Longest Common Subsequence,用于查找两个字符串中的最大公共子序列,这里需要注意区分子序列与子串,所谓子序列,指的是从前到后,可以跳跃元素筛选,而字串则必须连续筛 ...
- 求两个字符串最长子串的LCS算法 C语言实现(简短的实现函数)
/************************************************************************* > File Name: lcs.c > ...
- LCS算法思想
LCS问题就是求两个字符串最长公共子串的问题.解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0.然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的 ...
- LCS 算法
下面的程序分别实现了使用LCS求连续子串和不连续子串的匹配情况! http://beyond316.blog.51cto.com/7367775/1266360
- 所有不同的序列串-----LCS算法的变种
今天遇到LEETCODE的第115题: Distinct Subsequences Given a string S and a string T, count the number of disti ...
- 奇妙的算法之LCS妙解
LCS算法妙解 LCS问题简述:最长公共子序列 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列. LCS问题的分支:最长公共子串 ...
随机推荐
- PATH menu
先上效果图 主界面布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ...
- 分布式版本控制git常见问题之gitignore冲突(精简版)
上次写的的太模糊了,现在简单直接写出个人心得,如下: 原因是有人提交了.gitignore里面的内容,所以和本地的不一样,这样就有问题,那么pull都不可以,所以要这样: git update-ind ...
- C# 特性(Attribute)
个人定义:不侵入对象的情况下,添加对象附注信息. 官方定义:将预定义的系统信息或用户定义的自定义信息与目标元素相关联.目标元素可以是程序集.类.构造函数.委托.枚举.事件.字段.接口.方法.可移植可执 ...
- Java经典编程题50道之二十
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. public class Example20 { public static void ma ...
- spring管理配置文件的工厂类--PropertiesFactoryBean
使用这个工厂的配置,可以很方便的获取配置文件中的属性.具体使用如下; 对于属性配置,一般采用的是键值对的形式,如: key=value 属性配置文件一般使用的是XXX.properties,当然有时候 ...
- 常用数组、字符串方法总结&获取元素、DOM操作
字符串的方法.返回值.是否改变原字符串:1 charAt() 方法可返回指定位置的字符. 不改变原始字符串 JavaScript并没有一种有别于字符串类型的字符数据类型,返回的字符是长度为 1 的字符 ...
- python http长连接客户端
背景: 线上机器,需要过滤access日志,发送给另外一个api 期初是单进程,效率太低,改为多进程发送后,查看日志中偶尔会出现异常错误(忘记截图了...) 总之就是端口不够用了报错 原因: 每一条日 ...
- JS问题笔记——模拟Jq底层实现工厂模式
<script type="text/javascript"> (function (window,undefined){ function _$(arguments) ...
- ubuntu 系统 更改屏幕亮度为最大(15级亮度)
历经千辛万苦终于搞定屏幕亮度,现将成果分享如下. 硬件:联想K29 系统:UBUNTU 14.04 一.执行命令 sudo gedit /etc/default/grub 二.更改文本 然后找到 GR ...
- Go - method
hello, 大家好,由于之前工作上面的事情较多,所以关于go语言的学习就暂时“搁浅了”...不过从今天开始,我们又将回到了go语言的学习过程之中. 当然,我们学习go的"初心"是 ...