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问题的分支:最长公共子串 ...
随机推荐
- WPF自动更新程序
WPF AutoUpdater 描述: WPF+MVVM实现的自动更新程序 支持更新包文件验证(比较文件MD5码) 支持区分x86与x64程序的更新 支持更新程序的版本号 支持执行更新策略 截图: 使 ...
- Linux 库文件详解
转自: http://www.cppblog.com/deane/articles/165216.html http://blog.sciencenet.cn/blog-1225851-904348. ...
- Apache许可翻译
https://www.apache.org/licenses/LICENSE-2.0 Apache许可 2.0 2004.1 使用.复制和发行的术语和条件. 1 定义 "License&q ...
- 快速傅里叶变换(FFT)算法【详解】
快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...
- 设计模式一:关于C++写观察者模式的一些收获
先贴上部分代码: #include "stdafx.h" #include<iostream> #include<string> #include<v ...
- socket获取百度页面
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...
- dedecms列表页调用子栏目列表,织梦首页调用栏目的子栏目标签代码
dedecms列表页调用子栏目列表,织梦首页调用栏目的子栏目标签代码. dedecms列表页调用子栏目列表标签: {dede:channelartlist type='sun' }<a href ...
- 【原创】Ajax的用法总结
一.什么是Ajax Ajax英文全称为“ Asynchr JavsScript and XML”(异步的JavaScript和XML),是一种创建 交互式网页的开发技术. 二.Ajax技术的核心 Aj ...
- Android之使用JAVA占位符格式数据(很实用)
小编虽然是学java出生,但工作之后就一直从事android开发,很多java基础都忘记完了,最近一年从ES换到了AS,原来的很多习惯都收到了挑战,比如我喜欢ES写方法的时候先在JAVA projec ...
- XWindow启动流程
X Window系统架构 一.基本概念: 1.X Client:X客户端,运行在远端主机上 X Client最重要的工作就是处理来自 X Server 的动作,将该动作处理成为绘图数据, 再将这些绘图 ...