《动态规划》之--字符串比较问题(扩展距离)

数据结构学习第14篇 - 动态规划 动态规划算法 一、字符串的扩展距离 对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和。2个非空格字符的距离是它们的ASCII码之差的绝对值;空格与空格的距离为0,空格与其他字符的距离为一个定值k。在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩... 阅读详情

问题:

对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和。2个非空格字符的距离是它们的ASCII码之差的绝对值;空格与空格的距离为0,空格与其他字符的距离为一个定值k。在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩展距离。对于给定的字符串A和B,设计一个算法,计算其扩展距离。

测试数据:

输入:cmc      snmn        2       (分别表示字符串A、B和定值k)

输出:10

 

解答:

设字符串A和B的字串A[1...i]和B[1...j]的扩展距离是val(i, j);

依题意,字符串A和B有三种可能的情况:

1)A串最后一个字符是空格,B串最后一个字符是字母,则val(i, j) = val(i-1, j) + k;

2)A串最后一个字符时字母,B串最后一个字符时空格,则val(i, j) = val(i, j-1) + k;

3)A串和B串最后一个字符均是字母,则val(i, j) = val(i-1, j-1) + dist(ai , bi);

由上可知,val(i, j)具有最优子结构性质,且满足如下递推式:

val(i, j) = min{ val(i-1, j) + k,val(i, j) + k,val(i-1, j-1) + dist(ai , bi) }

(使用动态规划算法,自底向上的计算各个子问题并利用每次计算的结果,避免重复运算,从而降低算法复杂度。)

从动态规划递归式可知,算法的时间复杂度为O(mn),m和n分别是字符串A和B的长度。

 

代码如下:

#include <iostream>

#include <cmath>

 

#define MAX 100000    //标识最大的可能整数

 

int val[300][300];

 

std::string stra;        //字符串A

std::string strb;       //字符串B

int k;        //定值k

 

//返回字符a与b的ASCII码的差的绝对值

int dist(char a, char b)

{

         return abs(a-b);     

}

 

int comp()

{

         int len1, len2;

         int tmp;

         val[0][0] = 0;

         len1 =    stra.length();

         len2 = strb.length();

        

         for(int i=0; i<=len1; i++)   //字符串A和B的有效下标是º1~len,下标0表示空字符串

         {                                                                //i或j是0表示A或B串为空串

                   for(int j=0; j<=len2; j++)

                   {

                            if(i+j)//i和j至少一个大于0

                            {

                                     val[i][j] = MAX;

                                    

                                     tmp = val[i-1][j] + k;

                                     if(i && (tmp<val[i][j]))//i大于0

                                               val[i][j] = tmp;

                                              

                                     tmp = val[i][j-1]+k;

                                     if(j && (tmp<val[i][j]))//j大于0

                                               val[i][j] = tmp;

                                              

                                     tmp = val[i-1][j-1] + dist(stra[i], strb[j]);

                                     if((i*j) && (tmp<val[i][j])) //i和j至少有一个不为0

                                               val[i][j] = tmp;                                          

                            }

                   }       

         }

         return val[len1][len2];

}

 

int main()

{

         std::cin>>stra>>strb>>k;

         stra = " " + stra;      //此处在字符串开头添加一个空格,是为了使字符串stra

         strb = " " + strb;    //的控制台输入的有效字符下标从1到stra.length()

         std::cout<<comp()<<std::endl;

         system("pause");

         return 0;

}

 

 

 

003-5算法笔记【动态规划】习题3-17-字符串扩展距离 题目 对于长度相同的两个字符串A和B,其距离定义为相应位置字符距离之和.两个非空格字符的距离是它们的ASCII编码之差的绝对值;空格与空格的距离为0,空格与其他字符的距离为一定值k. 在一般情况下,字符串A和B的长度不一定相同.字符串A的扩展是在A中插入若干空格字符所产生的字符串.在字符串A和B的所有长度相同的扩展中,有一对距离最小的扩展,该距离称为字符串A和B的扩展距离. 对于给定的字符串A和B,试计算其扩展距离. 输入 第1行是字符串A,第2行是字符串B,第3行是空格与其他字符的距离定值k. cmc s 阅读详情

相关推荐

动态规划求字符串比较问题

《动态规划》之--字符串比较问题(扩展距离),主要思路通过策略和无效性来求解。特点最优子结构性质,重叠子问题。

C++字符串比较问题(动态规划)

利用动态规划的思想求解字符串比较问题

weixin_48842132的博客 1328

字符串比较问题对于长度相同的2 个字符串A和B,其距离定义为相应位置字符距离之和。2 个非空格

字符串比较问题 Description ?问题描述: 对于长度相同的2 个字符串A和B,其距离定义为相应位置字符距离之和。2 个非空格 字符的距离是它们的ASCII码之差的绝对值。空格与空格的距离为0;空格与其它字符的距 离为一定值k。 在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干 空格字符所产生的字符串。在字符串A 和B 的所有长度相同的扩展中,有一对距离最小的 扩展,该距离称为字符串A和B的扩展距离。 对于给定的字符串A和B,试设计一个算法,计算其扩展距离。 ?编程任务: 对于给定的字符串A和B,编程计算其扩展距离。 Input 由文件input.txt给出输入数据。第1 行是字符串A;第2 行是字符串B。第3行是空格 与其它字符的距离定值k。 Output 将计算出的字符串A和B的扩展距离输出到文件output.txt。 Sample Input cmc snmn 2 Sample Output 10

动态规划算法设计字符串比较问题_「Javascript算法设计」× 动态规划与回溯算法...

目录:分而治之算法动态规划回溯算法分而治之算法分而治之算法是算法设计的一种方式,它将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将解决方式合并以解决原来的问题(例如快速排序,二分搜索等)分而治之算法可以分成三个部分分解原问题为多个子问题(原问题的多个小实例)解决子问题,用返回解决子问题的方式的递归算法。递归算法的基本情形可以用来解决子问题组合这些子问题的解决方式,得到原问题的解我们利用...

weixin_31188807的博客 443

动态规划算法求解字符串比较问题c++源代码

对于给定的字符串A和B,给定其字串的内容和空格相对字符的距离,使用动态规划算法求解两字符串的扩展距离。

基于rms包的限制性立方样条回归(RCS)R代码实现

RCS

2301_79584199的博客 2万+

算法设计二(5)—— 字符串比较问题

代码链接:pan.baidu.com/s/1w-VSMWmr9ntEWWdxZoD4Yw 码:jnlh 算法分析与设计第 2 次实验 时间 2020.4.23 实验名称 字符串比较问题 实验目的 通过上机实验,要求掌握动态规划算法的问题描述、算法设计思想、程序设计。......

weixin_43973089的博客 1447

图数据挖掘 ECC K-core core number truss number clique

K-core:什么叫k-core,给定一个正整数k(k>=0),k-core是一个G的最大子图(也就是说k-core是一个图的限制),将这个子图定义为Hk,对于Hk中的每个顶点v,他的度数都是大于等于k的。 k-core是内嵌的,如下图所示,集合{ABCD}是H3,也就是3-core的子图。而集合{ABCDE}是H2,也就是2-core的子图,集合{ABCDEGF}是H1,也就是1-core的子图,而从集合的角度来讲H3<H2<H1。 core number:什么叫kcor

weixin_45193103的博客 1685

0329_算法22级1班实验3(动态规划)

设dp[i][j]表示从位置(i, j) 出发到达底部的最优路径的总和。则有递推关系:。这个递推关系表示,从当前位置出发,可以选择向下走或者向右下走,选择两者中路径权值较大的方向,然后加上当前位置的权值。

重生之费费写代码 988

李宏毅机器学习hw3

Homework 3 - Convolutional Neural Network 1作业概述 在food_11文件中有三个文件分别是training、validation、testing,打开training和validation可以看见总共有11种食物(0-10的类别编号),而testing是没有类别编号的。 然后用卷积神经网络对食物图片进行分类。 2导入用到的库 torch库 这个我弄了半天,直接pip总是timeout,用镜像源下下来又出现OSError: [WinError..

老问题的博客 4188

半导体工厂自动化实战:用secs4net实现设备与MES系统通信(附完整代码)

本文详细介绍了如何利用secs4net框架实现半导体工厂设备与MES系统的高效通信。通过解析SECS/GEM协议的核心架构、关键业务场景实现及性能优化实践,帮助开发者快速掌握工业自动化通信技术,提升生产效率和系统稳定性。

transformer2023的博客 892

字符串的扩展距离问题--------动态规划算法

学无止境,笔勤不辍。最近笔者又闲了下来,于是抽空在课上写一篇关于动态规划思想的典型问题(最近遇到的奇奇怪怪的问题,困扰了笔者一段时间)。希望能给大家一些帮助和启示...

Super_Ye6的博客 792

【2021工业图像异常检测文献】DRÆM: 基于判别性训练的重建嵌入表面异常检测方法

DRÆM – A discriminatively trained reconstruction embedding for surface anomaly detection

qq_1532145264的博客 1477

HNU_算法_实验3(2021级)-算法实验1-字符串比较问题

实现题3-17 字符串比较问题:

蟑螂恶霸的博客 1281

【机电杂谈2】BLDC和PMSM的特点和区别

在日常生活中,小到电动玩具,大到电动汽车,永磁电机的身影可以说是无处不在。有刷直流电机、无刷直流电机、永磁同步电机由于其结构和输出特定的不同也被应用到不同的场合。如果你经常拆一些玩具和家电,就会看到大量的有刷直流电机和无刷直流电机,而永磁同步电机主要应用在高精度的工业伺服和电动汽车领域。本文就从电机的结构和控制方面,对这几种常见的永磁电机做简单的梳理和归纳。

2936

数据集FFHQ和LSUN介绍【包含FFHQ1024,515,256,128分辨率图像获取方法】

FFHQ全称Flickr-Faces-High-Quality(Flickr-Faces-HQ),最初是作为生成式对抗网络(GAN)的基准创建的,也用于StyleGAN的训练数据集中,并由英伟达于2019年开源。CVPR_2019Flickr-Faces-HQ (FFHQ)其由 70,000 张分辨率为 1024×1024 的高质量 PNG 图像组成,在年龄、种族和图像背景方面包含相当大的差异。它对眼镜、太阳镜、帽子等配饰也有很好的覆盖。

zik的博客 3979

2016 东莞特长生 T3 :字串距离 【洛谷P1279】

2016  东莞特长生  T3:字串距离2016 ~~东莞特长生~~T3 :字串距离2016  东莞特长生  T3:字串距离 【问题描述】 设有字符串 X,我们称在 X 的头尾及中间插入任意多个空格后构成的新字符串为 X 的扩展串,如字符串 X 为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是 X 的扩展串,这里“□”代表空格字符。如果 A1 是字符串 A 的扩展串,B1 是字符串

天空之心 146

Claude Code本地Windows安装教程

本文介绍了在Windows系统上安装和配置Claude Code本地调用的详细步骤。首先需要确保网络畅通和账号余额充足,然后安装Node.js v22版本作为基础环境。接着通过npm全局安装Claude Code包,并进行版本验证。安装完成后,使用命令行登录并可以指定模型启动。最后还提供了切换API秘钥的方法,通过setup-token命令重新授权账号。整个过程配有详细的命令行示例和操作截图,方便用户按步骤完成安装配置。

猿小白的博客 2万+

LeetCode 72. 编辑距离(成本)(Hard)

题目链接 题解 编辑距离 思路 代码 class Solution: ### 0121 动态规划(156 ms,18.3 MB) def minDistance(self, word1: str, word2: str) -> int: n1, n2 = len(word1), len(word2) # 若其中一个单词为空,则直接返回另一个单词的字符数 if n1 * n2 == 0: return.

newCraftsman的博客 244

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

caioj 1070 dp

题目描述 【问题描述】 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为“abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X的扩展串,这里“□”代表空格字符。 如果A1是字符串A的扩展串,B1是字符串B的扩展串,A1与B1具有相同的长度,那么我们定义字符串A1与B1的距离为相应位置上的字符的距离总和

fan233的博客 315

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

经典算法题每日演练——第五题 字符串相似度

这篇我们看看最长公共子序列的另一个版本,求字符串相似度(编辑距离),我也说过了,这是一个非常实用的算法,在DNA对比,网 页聚类等方面都有用武之地。 一:概念 对于两个字符串A和B,通过基本的增删改将字符串A改成B,或者将B改成A,在改变的过程中我们使用的最少步骤称之为“编辑距离”。 比如如下的字符串:我们通过种种操作,痉挛之后编辑距离为3,不知道你看...

weixin_30588729的博客 68

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

算法动态规划

动态规划题目的基本思路: 1.寻找dp数组下标及其含义; 2.根据题目找出递归公式; 3.初始化dp数组(有的题目初始化都为1,有的都为0,根据题目初始化); 4.遍历数组(例如,dp[i][j]看是先遍历i还是先遍历j); 5.打印dp数组。

2301_80168220的博客 2150
上一篇: 《算法之美》の链表问题の获得链表中倒数第m个元素
下一篇: 桶排序及其应用
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值