经典问题LCS(最大公共子串问题)C代码实现

最长公共子串LCS (Longest Common Subsequence) 算法 三个方法都有所借鉴,但代码部分是自己试着写出来的,虽然最后的运行结果都是正确的,但此过程中难免会有考虑不周全的地方,如发现代码某些地方有误,欢迎指正。同时有新的想法,也可以提出! 采用顺序结构存储串,求串s和串t的一个最长公共子串。 方法一 算法思想:借助二维数组可以求出最长公共子串最后一个字符分别在s串和t串中的数组下标。此时可以从s中截取最长公共子串,也可以从t中截取。 SqString MaxComStr(SqString s, SqString t) { SqString str; in 阅读详情

LCS(Longest Commons Sequence)问题,也就是最长公共子串问题,是一个经典的算法问题。该问题在很多地方都会遇到。关于这个问题的解决方案,目前最佳的实现就是使用动态规划的方式进行实现,关于使用动态规划设计这个问题算法的过程,这里就不再描述了,网上有很多的描述,整理如下:
wiki百科中的描述:https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
UCI的《算法导论》课程线上教案:https://www.ics.uci.edu/~eppstein/161/960229.html
国立清华大学(台湾)线上教案:http://www.csie.ntnu.edu.tw/~u91029/LongestCommonSubsequence.html
等等,线上的资料太多了,我就不再重复造车轮了,建议大家吧前面几个链接中的资料好好看一下。下面是北京大学曲婉玲教授等编写的《算法设计与分析》第二版中的LCS描述截图:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
下面我给出一个使用C语言实现的LCS,使用上图中的伪代码方法:

/*************************************************************************
    > File Name: lcs.c
    > Author: Baniel Gao
    > Mail: createchance@163.com 
    > Created Time: Tue 29 Nov 2016 01:53:13 PM CST
 ************************************************************************/

#include <stdio.h>
#include <string.h>

// 追踪标记
// 这里的实现不是很好,但是C语言二维数据指针操作真是的很恶心,所以出此下策
char tracker[100][100];

void print_lcs_by_tracker(char* str1, int m, int n)
{
    if (m == 0 || n == 0) {
        return;
    }

    if (tracker[m - 1][n - 1] == '\\') {
        print_lcs_by_tracker(str1, m - 1, n - 1);
        printf("%c", str1[m - 1]);
    } else if(tracker[m - 1][n - 1] == '|') {
        print_lcs_by_tracker(str1, m - 1, n);
    } else {
        print_lcs_by_tracker(str1, m, n - 1);
    }
}

void lcs(char* str1, char* str2, int m, int n)
{
    int len = 0;
    int len_arr[m + 1][n + 1];

    for (int i = 0; i <= m; i++)
    {
        len_arr[i][0] = 0;
    }

    for (int i = 0; i <= n; i++)
    {
        len_arr[0][i] = 0;
    }

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (str1[i] == str2[j]) {
                len_arr[i + 1][j + 1] = len_arr[i][j] + 1;
                tracker[i][j] = '\\';
            } else if (len_arr[i][j + 1] >= len_arr[i + 1][j]) {
                len_arr[i + 1][j + 1] = len_arr[i][j + 1];
                tracker[i][j] = '|';
            } else {
                len_arr[i + 1][j + 1] = len_arr[i + 1][j];
                tracker[i][j] = '-';
            }
        }
    }

    printf("Length array is: \n");
    for (int i = 0; i <= n; i++) {
        printf("\t%d", i);
    }
    printf("\n");
    for (int i = 0; i <= n; i++) {
        printf("\t___", i);
    }
    printf("\n");
    for (int i = 0; i <= m; i++) {
        printf("%d\t|", i);
        for (int j = 0; j <= n; j++) {
            printf("%d\t", len_arr[i][j]);
        }
        printf("\n");
    }

    printf("Tracker is: \n");
    for (int i = 1; i <= n; i++) {
        printf("\t%d", i);
    }
    printf("\n");
    for (int i = 1; i <= n; i++) {
        printf("\t___", i);
    }
    printf("\n");
    for (int i = 0; i < m; i++) {
        printf("%d\t|", i + 1);
        for (int j = 0; j < n; j++) {
            printf("%c\t", tracker[i][j]);
        }
        printf("\n");
    }

    printf("Len of LCS is: %d. \n", len_arr[m][n]);
    printf("LCS is: ");
    print_lcs_by_tracker(str1, m, n);
    printf("\n");
}

int main(int argc, char *argv[])
{
    int lcs_len = 0;

    if (argc != 3)
    {
        printf("Usage: %s <string1> <string2> \n", argv[0]);
        return -1;
    }
    char* x = argv[1];
    char* y = argv[2];

    int m = strlen(x);
    int n = strlen(y);

    lcs(x, y, m, n);

    return 0;
}

运行截图:
这里写图片描述

求最长公共子串,简单易懂 求两个字符串的最长公共子串描述算法思路1.代码2.动态规划总结 描述 两个字符串,求出两个字符串最长公共字串的长度。 例如: 输入:abcdbeac acdbcdb 输出:3 算法思路 1.把两个字符串看成一个二维的矩阵; 2.比较矩阵中的点对应的行和列的字符是否相同,相同置为1,否则置为0; 3.找出其中值为1的最长对角线的长度,对应就是最长公共子串的长度。 例如: s1=abcdbeac s2=acdbcdb 可以看出,最长的1对角线长度为4,最长公共子串长度为5。 进一步优化: 在给矩阵元素赋值时, 阅读详情

相关推荐

C++实现——LCS-最大公共子串长度

//求两个字符串的最长公共子串的长度(子串不一定是原串中的连续子串组成) //LCS //使用动态规划 #include <iostream> #include <string> #include <vector> using namespace std; int lcs_len(string s1, string s2){ int len1 = s1.size(), len2 = s2.s

硅谷 4235

最长公共子序列(LCS)

整合资料编写,志愿时长认定

2301_77033392的博客 5329

子序列与子串问题(最长公共、最长递增)

子序列与子串问题(最长公共、最长递增)概念1. 最长公共子序列(LCS)1.1 问题描述1.2 思路 上一期总结了leetcode 中的关于最长回文子串问题的解决方法,大概分为:暴力枚举、动态规划、马拉车算法(Manacher)、中心扩展等,其中有一种可以转换为最长公共子串解决的方法,顿时想到了许多关于子串和子序列的众多问题,其中包括最长公共子序列和最长公共子串的问题,最长递增子序列的问题等等,现在做一下总结。 概念 (1)字符子串:指的是字符串中连续的n个字符,如abcdefg中,ab,cde,fg等都属

qq_43232556的博客 874

LCS算法

<br /><br />首先将要看到如何运用动态编程查找两个 DNA 序列的最长公共子序列(longest common subsequence,LCS)。发现了新的基因序列的生物学家通常想知道该基因序列与其他哪个序列最相似。查找 LCS 是计算两个序列相似程度的一种方法:LCS 越长,两个序列越相似。<br />子序列中的字符与子字符串中的字符不同,它们不需要是连续的。例如,ACE 是 ABCDE 的子序列,但不是它的子字符串。请看下面两个 DNA 序列:S1 = DE>GCCCTAGCGDE>S2 = 

leohxj的专栏 2万+

c++最长公共子序列问题LCSLength

动态规划的问题解题思路都差不多(一些浅见),基本要素是最优子结构性质,子问题重叠性质,自底向上的求解方法。只要了解了基本要素,那么这种题型也会更好理解。本题有不少注释,便于读者阅读。

求解最长公共子序列(LCS)C语言

求最长公共子序列问题(LCS/c++) 两个序列,求解两个序列中最长公共的子序列

动态规划解最长公共子序列问题(LCS)C语言加注释

【问题】 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj。例如,X=“ABCBDAB

baidu_20363843的博客 2万+

算法导论LCS

算法导论 DNA的匹配算法 是当年苦学力行的结果希望有用。

动态规划C语言实现之最长公共子序列(LCS)

动态规划中,我曾对于01背包和硬币问题有过一些理解,今天参考了博客上其他同学的经验,完成了最长公共子序列LCS的代码实现。上面都是摘自《算法导论》,如果熟悉这两个内容,那么实现起来就方便许多。2.状态转移表(数组用来存放位置和长度)

Machine Learning with Tutors 1万+

求解LCS算法

求解最长公共子序列LCS的算法,亲测可用,快来下载吧

Cube.js 安装避坑指南:从零到一键启动

本文是一份详细的Cube.js安装避坑指南,旨在帮助开发者从零开始顺利启动Cube.js。文章重点强调了安装前的环境准备,包括Node.js版本、包管理工具和项目路径等关键“地基”,并深入解析了使用npx安装的优势、数据库类型选择以及数据库连接配置的核心步骤与常见陷阱,确保您能高效完成安装并成功启动服务。

weixin_29218509的博客 429

NYOJ36-最长公共子序列

最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。 tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中

程序猿之洞 1454

ModusToolbox 实战避坑指南|从环境配置到项目构建

本文是一份详尽的ModusToolbox实战避坑指南,手把手教你从环境配置到项目构建。重点解决了Windows系统下的安装、关键环境变量CY_TOOLS_PATHS的设置、PowerShell执行策略调整以及利用URL Modifier工具优化GitHub资源下载等核心难题,旨在帮助开发者,特别是英飞凌(Infineon)芯片用户,顺利搭建开发环境并成功运行第一个Hello World程序。

t1u2v的博客 591

LCS(最长公共子串) python3实现

LCS问题就是求两个字符串最大相同的公共子串;我们现假设有两个字符串X,Y。其长度分别为m,n 我们从X,Y两个字符串的最后一个字符串开始看起 如果 Xm = Yn: LCS(X, Y) = LCS(Xm-1, Yn-1)+ "Xm" 如果Xm != Yn: LCS(X,Y) = max(LCS(Xm-1,Yn), LCS(Xm, Yn-1)) 我们即构建了这样的动态转移方程。如果...

爱发呆的小小曹 3928

win10自动修复-无限循环【通用完美】超简单解决办法

2020.02.14今个我的笔记本电脑(Thinkpad Carbon 7 X1)(win10)早晨起来发现蓝屏,上面显示自动修复失败,重启后依然自动修复失败,不断手动重启,始终是修复失败。然后上网开始搜集资料找解决办法。 前边介绍关闭自动修复,如何找出错文件的方法;如果想看最终解决办法,直接看第三部分 上网就会发现这种现象很常见,同时是电脑自动安装系统更新,或者安装某些驱动出现。解决办法也大...

y15941300574的博客 19万+

使用Python开发TreeATE的测试脚本常见问题

ImportError: No module named py_compile 找不到 DevLangPython3.dll 以上2个问题都是没有安装正确的Python,当前TreeATE依赖32位Python 2.7版本,暂时不支持Python 3以上版本

蓝白云的专栏 1033

最长公共子串LCS【C语言】

最长公共子串【C语言】 题目: 求顺序串S和顺序串T的一个最长公共子串。 时间复杂度为任意 空间复杂度为任意 代码: 运行情况: Copyright © 2019 wyq. All rights reserved. ...

在人间已是颠 559

别再乱选WiFi信道了!手把手教你用WiFi Analyzer优化2.4G/5G家庭网络(附避坑指南)

本文详细介绍了如何使用WiFi Analyzer工具优化家庭WiFi网络,解决2.4GHz和5GHz信道的冲突问题。通过分析信道拥堵原因、提供安装使用指南及优化策略,帮助用户显著提升网络速度与稳定性,特别适合密集住宅区和多设备家庭。

weixin_42665725的博客 5880

最长公共子串LCS

找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。其实这又是一个序贯决策问题,可以用动态规划来求解。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"ab")

慢慢的前进 1865

卡尔曼滤波与目标追踪

卡尔曼滤波与目标追踪为什么要学卡尔曼滤波?卡尔曼滤波是什么?一些概率论的知识基础卡尔曼滤波完整推导状态估计计算卡尔曼增益预测和更新 卡尔曼滤波部分我打算分三节(三次博客的内容): 卡尔曼滤波与行人状态估计 扩展卡尔曼滤波(EKF)与传感器融合 过程模型,无损卡尔曼滤波(UKF)与车辆状态轨迹 为什么要学卡尔曼滤波? 卡尔曼滤波以及其扩展算法能够应用于目标状态估计,如果这个目标是行人,那么就是行人状态估计(或者说行人追踪),如果这个目标是自身,那么就是车辆自身的追踪(结合一些地图的先验,GPS等数据的话就

qq_43232556的博客 4171

模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

整理的算法模板合集: ACM模板 目录一、树的直径树形DP两次DFS / BFS(找到直径的两个端点)二、动态修改树的边权并求每个时刻的直径(线段树)三、树的重心 一、树的直径 树的直径满足如下性质: 若有多条直径,则所有的直径之间皆有公共点。 直径的两端一定是叶子。 树中距离某一直径端点最远的点,至少有一个是该直径的另一个端点。 对于树上任意一个点,与之距离最远的一个点,至少有一个直径的端点。 给你一个无权无向的树。编写程序以输出该树中最长路径(从一个节点到另一个节点)的长度。在这

繁凡さん的博客 1676

动态规划求两个字符串的最长公共子串和最长公共序列

@YangYang48 求两个字符串的最长公共子串和最长公共序列 基本概念 最长公共子串(Longest Common Substring)问题是寻找两个或多个已知字符串最长的子串,且子串却必须是连续的。 最长公共子序列(Longest Common Subsequence)问题的区别在于子序列且子串不是连续的。 问题描述 有两个字符串str和str2,求出两个字符串中最长公共子串长度。 示例...

yangju147532896的博客 4012

AI上推荐 之 NeuralCF与PNN模型(改变特征交叉方式)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 1万+

LCS求两个字符串的最大公共子串

//求两个字符串的公共最大子串 public class GetLCStringTest { public static String getLCSring(String str1, String str2) { StringBuffer str = new StringBuffer(); int i, j; int len1, len2; len1 = str1.length(); len2 = str2.length(); int maxlen = len1 >

Jay_Fighting的专栏 2068

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

动态规划思想计算最大公共子串(c++代码)

问题: 计算两个字符串的最大公共子串(longest common continue substring), 注意不是子序列是子串,子串是要求字符之间是相连的,而序列则只要求是保持前后顺序不变. 我们这里要求的是最长公共子串的长度. 思想: 设:C[i,j] = LCS(str1[1...i],str2[1...j]), 即C[i,j]表示序列str1[1...i]和str2[1...j]的最长公共子序列的长度,则 C[m,n] = LCS(str1,str2)...

Yi Sun的博客 1064

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

最长公共子串问题的后缀数组解法

[最长公共子串] 最长公共子串(Longest Common Substring ,简称LCS)问题,是指求给定的一组字符串长度最大的共有的子串的问题。例如字符串”abcb”,”bca”,”acbc”的LCS就是”bc”。 求多串的LCS,显然穷举法是极端低效的算法。改进一些的算法是用一个串的每个后缀对其他所有串进行部分匹配,用KMP算法,时间复杂度为O(N*L^2),其中N为字符串个数,L为

苏嵌——杭天龙 5425

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: ZeroMQ简明教程
下一篇: Topological Sort拓扑排序
createchance
博客等级 码龄15年 156粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值