动态规划-最长公共子串(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://xiahunao.cn/news/2812946.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

pdf如何压缩文件大小?pdf文件在线压缩方法介绍

在日常工作中&#xff0c;我们经常使用PDF文件进行传输和保存&#xff0c;然而&#xff0c;有时候我们会遇到过大的PDF文件&#xff0c;这不仅会导致传输困难&#xff0c;还会占用过多的设备空间&#xff0c;因此&#xff0c;我们需要对PDF压缩一下以便更轻松地传输和保存&…

2024年【安全员-B证】考试资料及安全员-B证模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-B证考试资料是安全生产模拟考试一点通总题库中生成的一套安全员-B证模拟考试&#xff0c;安全生产模拟考试一点通上安全员-B证作业手机同步练习。2024年【安全员-B证】考试资料及安全员-B证模拟考试 1、【多选…

WebFilter【通过过滤器实现登录判断】

WebFilter【通过过滤器实现登录判断】 /*** 检查用户是否已经完成登录*/ WebFilter(filterName "loginCheckFilter",urlPatterns "/*") Slf4j public class LoginCheckFilter implements Filter{//路径匹配器&#xff0c;支持通配符public static final …

MATLAB环境下基于变分贝叶斯的组织学病理图像颜色盲反卷积方法

图像盲反卷积问题仅根据模糊图像估计清晰图像和模糊核&#xff0c;也是一个欠定问题且求解更加困难。但图像盲反卷积算法更实际&#xff0c;因为许多情况下&#xff0c;模糊核都是未知或部分已知的。求解盲反卷积问题需要为未知量选择适当的先验模型&#xff0c;以得到清晰图像…

SM100-40-080-P0-45-S1-B电机厦门参详

SM100-40-080-P0-45-S1-B交流伺服电机也是无刷电机&#xff0c;分为同步和异步电机&#xff0c;运动控制中一般都用同步电机&#xff0c;它的功率范围大&#xff0c;可以做到很大的功率。大惯量&#xff0c;最高转动速度低&#xff0c;且随着功率增大而快速降低。因而适合做低速…

JSON简介以及如何在Python中使用JSON

什么是JSON&#xff1f; JSON是"JavaScript Object Notation"的简称&#xff0c;是一种数据交换格式 JSON格式 假设我们有一个对象&#xff0c;这个对象有两个属性&#xff1a;“name”跟“age”。 在JSON中是这样表达的&#xff1a; { "name":"男孩…

APP软件设计要注意的问题

设计一个成功的APP软件需要考虑多个方面&#xff0c;成功的APP设计需要综合考虑用户体验、性能稳定性、安全性、兼容性、反馈机制、内容质量和法律合规等多个方面&#xff0c;不断优化和改进以满足用户需求并提升用户满意度。以下是一些需要注意的问题&#xff0c;希望对大家有…

免费的通配符(泛域名证书)?

通配符证书&#xff08;Wildcard SSL Certificate&#xff09;是一种SSL证书&#xff0c;它可以用于保护一个域名及其所有的子域名。与传统的SSL证书不同&#xff0c;传统SSL证书仅用于保护一个单独的完全限定域名或一个子域名。通配符证书通过在域名前加上一个星号&#xff08…

VUE从0到1创建项目及基本路由、页面配置

一、创建项目:(前提已经安装好vue和npm) 目录:E:\personal\project_pro\ windows下,win+R 输入cmd进入命令行: cd E:\personal\project_pro E:# 创建名为test的项目 vue create test# 用上下键选择vue2或vue3,回车确认创建本次选择VUE3 创建好项目后,使用…

【可实战】被测系统业务架构、系统架构、技术架构、数据流、业务逻辑分析

一、为什么要学习 更深的理解业务逻辑&#xff08;公司是做什么的&#xff1f;它最重要的商务决策是什么&#xff1f;它里面的数据流是怎么做的&#xff1f;有哪些业务场景&#xff1f;考验你对这家公司、对所负责业务的熟悉程度。公司背后服务器用什么软件搭建的&#xff1f;…

面试官: 反射了解么?

目录 反射 什么是反射 ? 获取Class对象的四种方式 反射相关API 类对象常用API Filed常用API Method常用API Constructors常用API 反射的使用场景? 反射的实现原理 ?(todo) 反射为什么这么慢 ? 反射的优缺点 反射中&#xff0c;Class.forName和ClassLoader的区别…

【前沿热点视觉算法|Sora|GPT4相关】-显著目标检测的深度增强交叉模态级联网络

计算机视觉算法分享。问题或建议&#xff0c;请文章私信或者文章末尾扫码加微信留言。sora 具体介绍和使用方法&#xff1a;OpenAI Sora 下一代生产力&#xff1a;最新小白必看教程 | 解剖Sora的前世今生 | Sora核心源码目前 openai 官方还未开放 sora 灰度&#xff0c;不过根据…

Linux学习笔记:fork()函数

TOC fork()函数的作用是什么? fork函数一般是用来创建进程的,在fork函数执行后,如果成功创建新进程就会出现两个进程,一个是父进程,一个是子进程 就像火影忍者中的分身术一样,fork之后就会进程就会分出和他一样的分身出来 fork()函数怎么使用? 在使用fork函数之前需要加上…

腾讯云4核8G服务器收费贵不贵?

腾讯云4核8G服务器多少钱&#xff1f;轻量应用服务器4核8G12M带宽一年446元、646元15个月&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;在txy.wiki可以查询详细配置和精准报价…

kubeadm部署K8S

部署二主二从 主1&#xff1a;192.168.116.17 主2&#xff1a;192.168.116.18 从1&#xff1a;192.168.116.12 从2&#xff1a;192.168.116.13 注意事项&#xff1a; master节点的cpu核心数必须要求大于2 K8S最新版本并不一定是最好的&#xff0c;相对于旧版本&#xff…

RISC-V SoC + AI | 在全志 D1「哪吒」开发板上,跑个 ncnn 神经网络推理框架的 demo

引言 D1 是全志科技首款基于 RISC-V 指令集的 SoC&#xff0c;主核是来自阿里平头哥的 64 位的 玄铁 C906。「哪吒」开发板 是全志在线基于全志科技 D1 芯片定制的 AIoT 开发板&#xff0c;是目前还比较罕见的使用 RISC-V SoC 且可运行 GNU/Linux 操作系统的可量产开发板。 n…

配置用户通过IPv6方式上网

组网需求 运营商为企业分配了WAN侧的IPv6地址1111:2222:A0EE:6::2/64和LAN侧的IPv6地址1111:3333:E840:2::1/64&#xff0c;企业通过运营商提供的IPv6地址配置上网。 图1 配置用户通过IPv6方式上网 操作步骤 1、在IPS上的配置 interface GigabitEthernet0/0/4 ipv6 enable…

【视频编码\VVC】量化基础知识

量化&#xff1a;是将信号的连续取值&#xff08;大量离散取值&#xff09;映射为有限多个离散赋值的过程。实现信号取值多对一的映射。可以有效减少信号取值的空间&#xff0c;进而获得更好的压缩效果。 根据输出和输入数据的类型&#xff0c;可以将量化器分为标量量化SQ和矢…

java中容器继承体系

首先上图 源码解析 打开Collection接口源码&#xff0c;能够看到Collection接口是继承了Iterable接口。 public interface Collection<E> extends Iterable<E> { /** * ...... */ } 以下是Iterable接口源码及注释 /** * Implementing this inte…

代码随想录Leetcode474. 一和零

题目&#xff1a; 代码(首刷看解析 2024年2月26日&#xff09; class Solution { public:// 二维 0 1背包int findMaxForm(vector<string>& strs, int m, int n) {// 1 二维 [i]表示 0 的个数&#xff0c;上限m; [j]表示 1 的个数&#xff0c;上限nvector<vector…