动态规划-最长公共子串(c)

动态规划

动态规划(dynamic programming)是一种算法设计方法。基本思想是在对一个问题的多阶段决策中,按照某一顺序,根据每一步所选决策的不同,会引起状态的转移,最后会在变化的状态中获取到一个决策序列。
上面这段话是比较官方的术语描述,还可以这样从编程层面理解:动态规划一般用于求解具有重叠子问题和最优子结构特性的问题。它通过将大问题分解为小问题,并存储小问题的解(通常在一个表格中),避免了重复计算,从而提高了效率。动态规划可以应用于许多类型的问题,包括但不限于最优化问题、计数问题和决策问题。

最长公共子串

比较2个字符串,找出最长的公共子串,这就是最长公共子串问题(longest common substring, 简lcs)。
本文描述的最长子串问题,还有一个输出限制:若存在多个最长公共子串,输出在较短字符串中最先出现的那个lcs。这个限制简化了问题,让我们专注在寻找lcs的算法本源上。
动态规划思路:使用一个二维数组dp_cs记录字符串a和b比较的中间结果,其中dp_cs[i+1][j+1]表示a[0~i]与b[0~j]比较,以a[i]和b[j]结尾的最长子串的长度。如果a[i]==b[j],那么dp_cs[i+1][j+1] = dp[i][j] + 1,否则dp_cs[i+1][j+1] = 0。
代码如下:

char *dp_longest_common_substring(const char *a, const char *b) {int len_a = strlen(a), len_b = strlen(b), maxLen = 0, endPos = 0;int dp_cs[len_a + 1][len_b + 1];memset(dp_cs, 0, sizeof(dp_cs)); // 默认都为0for (int i = 0; i < len_a; i++) {for (int j = 0; j < len_b; j++) {if (a[i] == b[j]) {dp_cs[i + 1][j + 1] = dp_cs[i][j] + 1;if (dp_cs[i + 1][j + 1] > maxLen) {maxLen = dp_cs[i + 1][j + 1];   // 记录最长的子串长度endPos = len_a > len_b ? j : i; // 记录最长子串的位置(在最短字符串中的结束位置)}}}}if (maxLen > 0) {char *substr = (char *)malloc(maxLen + 1); // 注意返回的子串需要free掉,否则内存泄漏strncpy(substr, len_a > len_b ? &b[endPos - maxLen + 1] : &a[endPos - maxLen + 1], maxLen);substr[maxLen] = '\0';return substr;}return NULL;
}

测试代码:

int test_lcs(int argc, char **argv) {string str1s[] = {"123123", "123213", "3243522", "35qeaaaafu", "12aaaaiul"};string str2s[] = {"123123", "123213", "3243522", "qeaaaaf", "aaaaiu"};for (int i = 0; i < sizeof(str1s) / sizeof(str1s[0]); i++) {char *lcs = dp_longest_common_substring(str1s[i].c_str(), str2s[i].c_str());if (lcs == NULL) {printf(">>>> case[%02d] has no lcs\n", i + 1);continue;}printf(">>>> case[%02d] lcs: '%s'\n", i + 1, lcs);free(lcs);}return 0;
}

测试输出:
lcs测试输出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs code更新后json文件无法识别通配符 ,编译多文件失败的解决办法

问题描述 在Mac或者LInux上&#xff0c;进行C/C相同路径下进行多文件编译时&#xff0c;之前设置好的json文件突然不能解释通配符&#xff0c;并且将带有单引号的地址传给clang&#xff0c;由于*.c被扩在单引号中&#xff0c;clang找不到文件导致失败。 如果将命令端中的指令复…

云服务器无法Ping通解决

问题: 使用公网IP地址PING云服务器,无法PING通 但是可SSH到服务器,表示通信链路是正常的,可能是端口或路径规则未开放导致 登陆云服务器后台,进行安全组规则查看,发现ICMP没有放行 添加允许ICMP连接规则 成功PING通云服务器

LeetCode——二叉树(Java)

二叉树 简介[简单] 144. 二叉树的前序遍历、94. 二叉树的中序遍历、145. 二叉树的后序遍历二叉树层序遍历[中等] 102. 二叉树的层序遍历[中等] 107. 二叉树的层序遍历 II[中等] 199. 二叉树的右视图[简单] 637. 二叉树的层平均值[中等] 429. N 叉树的层序遍历[中等] 515. 在每个…

AcWing 4726. 寻找数字

解题思路 在这个二插搜索树中寻找&#xff0c;4和7数量相等&#xff0c;并且大于n的最小数。 相关代码 import java.util.*;public class Main {static String s;static List<Integer> res new ArrayList<>();static long n;static long ansLong.MAX_VALUE;publ…

使用HTML5画布(Canvas)模拟图层(Layers)效果

使用HTML5画布&#xff08;Canvas&#xff09;模拟图层&#xff08;Layers&#xff09;效果 在图形处理和计算机图形学中&#xff0c;图层&#xff08;Layers&#xff09;是指将图像分成不同的可独立编辑、组合和控制的部分的技术或概念。每个图层都可以包含不同的图形元素、效…

18.题目:编号760 数的计算

题目&#xff1a; ###该题主要考察递推、递归 将该题看成若干个子问题 #include<bits/stdc.h> using namespace std; const int N20; int a[N];int dfs(int dep){int res1;for(int i1;i<a[dep-1]/2;i){a[dep]i;resdfs(dep1);}return res; }int main(){int n;cin>…

python并发 map函数的妙用

1.map是什么&#xff1f; map函数是Python中的一个内置函数&#xff0c;用于将一个函数应用到一个或多个可迭代对象的每个元素上&#xff0c;生成一个新的可迭代对象。它的一般形式是&#xff1a; map(function, iterable1, iterable2, ...)其中&#xff0c;function是一个函…

《Spring Security 简易速速上手小册》第8章 常见问题与解决方案(2024 最新版)

文章目录 8.1 异常处理和日志记录8.1.1 基础知识详解8.1.2 重点案例&#xff1a;统一异常处理案例 Demo拓展 8.1.3 拓展案例 1&#xff1a;日志记录策略案例 Demo拓展 8.1.4 拓展案例 2&#xff1a;日志聚合案例 Demo拓展 8.2 多租户安全性问题8.2.1 基础知识详解8.2.2 重点案例…

深入Kafka client

分区分配策略 客户端可以自定义分区分配策略, 当然也需要考虑分区消费之后的offset提交, 是否有冲突。 消费者协调器和组协调器 a. 消费者的不同分区策略, 消费者之间的负载均衡(新消费者加入或者存量消费者退出), 需要broker做必要的协调。 b. Kafka按照消费组管理消费者, …

VUE3:省市区联级选择器

一、实现效果 二、代码展示 <template><div class"page"><select v-model"property.province"><option v-for"item in provinces" :key"item">{{ item }}</option></select><select v-model&…

今日学习总结2024.3.2

最近的学习状态比较好&#xff0c;感觉非常享受知识进入脑子的过程&#xff0c;有点上头。 实验室一个星期唯一一天的假期周六&#xff0c;也就是今天&#xff0c;也完全不想放假出去玩啊&#xff0c;在实验室泡了一天。 很后悔之前胆小&#xff0c;没有提前投简历找实习&…

YOLOv9有效提点|加入MobileViT 、SK 、Double Attention Networks、CoTAttention等几十种注意力机制(五)

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、本文介绍 本文只有代码及注意力模块简介&#xff0c;YOLOv9中的添加教程&#xff1a;可以看这篇文章。 YOLOv9有效提点|加入SE、CBAM、ECA、SimA…

ETH网络中的区块链

回顾BTC网络的区块链系统 什么是区块链&#xff1f;BTC网络是如何运行的&#xff1f;BTC交易模式 - UXTO ETH网络中的区块链 ETH网络的基石依旧是 区块链。上面 什么是区块链&#xff1f; 的文章依旧适用。 相比BTC网络&#xff0c;ETH网络的账户系统就相对复杂&#xff0c;所…

实用工具:实时监控服务器CPU负载状态并邮件通知并启用开机自启

作用&#xff1a;在服务器CPU高负载时发送邮件通知 目录 一、功能代码 二、配置开机自启动该监控脚本 1&#xff0c;配置自启脚本 2&#xff0c;启动 三、功能测试 一、功能代码 功能&#xff1a;在CPU负载超过预设置的90%阈值时就发送邮件通知&#xff01;邮件内容显示…

js中Generator函数详解

定义&#xff1a; promise是为了解决回调地狱的难题出现的&#xff0c;那么 Generator 就是为了解决异步问题而出现的。 普通函数&#xff0c;如果调用它会立即执行完毕&#xff1b;Generator 函数&#xff0c;它可以暂停&#xff0c;不一定马上把函数体中的所有代码执行完毕…

Linux基本指令(下)

目录 1. less指令 2. head与tail指令 3. find指令 示例 4. grep指令 示例 ​编辑 5. zip/unzip 打包与压缩 示例 ​编辑 6. tar指令 7. find指令&#xff1a; -name 8. echo指令 9. 时间相关的指令 1.在显示方面&#xff0c;使用者可以设定欲显示的格式&#xff…

【机器学习】有监督学习算法之:K最近邻

K最近邻 1、引言2、决策树2.1 定义2.2 原理2.3 实现方式2.3.1 距离度量2.3.2 K值的选择 2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 这么长时间没更新了&#xff0c;是不是得抓紧时间了。 小鱼&#xff1a;最近可都是在忙的呢&#xff0c;…

线上历史馆藏系统 Java+SpringBoot+Vue+MySQL

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

day09_商品管理订单管理SpringTaskEcharts

文章目录 1 商品管理1.1 添加功能1.1.1 需求说明1.1.2 核心概念SPUSKU 1.1.3 加载品牌数据CategoryBrandControllerCategoryBrandServiceCategoryBrandMapperCategoryBrandMapper.xml 1.1.4 加载商品单元数据ProductUnitProductUnitControllerProductUnitServiceProductUnitMap…

数据结构与算法-冒泡排序

引言 在数据结构与算法的世界里&#xff0c;冒泡排序作为基础排序算法之一&#xff0c;以其直观易懂的原理和实现方式&#xff0c;为理解更复杂的数据处理逻辑提供了坚实的入门阶梯。尽管在实际应用中由于其效率问题不常被用于大规模数据的排序任务&#xff0c;但它对于每一位初…