问题:
对于长度相同的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;
}
分享到:
相关推荐
《动态规划》之--字符串比较问题(扩展距离),主要思路通过策略和无效性来求解。特点最优子结构性质,重叠子问题。
字符串比较问题 Description ?问题描述: 对于长度相同的2 个字符串A和B,其距离定义为相应位置字符距离之和。2 个非空格 字符的距离是它们的ASCII码之差的绝对值。空格与空格的距离为0;空格与其它字符的距 离...
【资源说明】基于C++实现动态规划计算两个字符串之间的扩展距离源码+sln解决方案.zip基于C++实现动态规划计算两个字符串之间的扩展距离源码+sln解决方案.zip基于C++实现动态规划计算两个字符串之间的扩展距离源码+...
对于给定的字符串A和B,给定其字串的内容和空格相对字符的距离,使用动态规划算法求解两字符串的扩展距离。
经典的动态规划方法可以解决编辑距离问题,但时间复杂度为O(m * n)。为了提高效率,可以采用更高级的算法,如Wagner-Fischer算法的优化版或者Ukkonen的在线算法。 1. Wagner-Fischer算法优化: 原始的Wagner-...
题目描述:对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和。2个非空格字符的距离是它们的ASCII码之...在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩展距离。
在计算机科学领域,字符串相似度比较算法是一种用于评估两个字符串之间相似程度的技术。这些算法广泛应用于文本处理、信息检索、生物信息学等多个领域。当我们要判断两个字符串是否含有相同或相近的信息时,这类算法...
距离的计算:如果A1是字符串A的扩展串,B1是字符串B的扩展串,A1与B1具有相同的长度,那么定义字符串A1与B1的距离为相应位置上的字符的距离总和,而两个非空格字符的距离定义为它们的ASCII码的差的绝对值,而空格...
在iOS开发中,属性字符串(NSAttributedString)是一种强大的文本处理工具,它可以用来展示具有不同样式、颜色、链接等特性的文本。这个"ios-对属性字符串的简单封装.zip"项目显然提供了一个简化的接口,用于更方便...
在互联网时代,面对海量的数据,如何高效地进行远程大规模字符串比较是许多企业和开发者面临的挑战。这一问题涉及到数据处理、分布式计算、算法优化等多个IT领域的关键知识点。以下将详细阐述相关技术点。 首先,...
总的来说,字符串相似度比较是信息技术中的基础工具,深入理解和灵活运用这些算法能帮助我们解决多种实际问题。通过“字符串相似度比较T-2021-7-1.rar”中的内容,我们可以系统学习这一领域的知识,提升处理文本数据...
字符串相似度度量算法如Levenshtein距离提供了一种衡量两个字符串之间差异的方法,而最长回文串问题可通过Manacher算法高效解决。字符串匹配是解决许多实际问题的关键技术,它包括单模式匹配和多模式匹配两大类。 ...
动态规划在解决字符串的扩展距离问题上展示了其强大的能力。通过构建二维数组并利用最优子结构,我们可以有效地找出最小的扩展距离。这个实验不仅锻炼了对动态规划的理解,还提升了编程实现动态规划算法的能力。
本题目是在传统编辑距离的基础上进行了一定程度的变化和扩展,要求求解从一个字符串到另一个字符串的最短路径,特别地,在字符串中的相应位置字符相同时,可以直接跳过中间的步骤。 #### 颢目描述 给定两个字符串A...
如果A1是字符串A的扩展串,B1是字符串B的扩展串,A1与B1具有相同的长度,那么定义字符串A1与B1的距离为相应位置上的字符的距离总和,而两个非空格字符的距离定义为它们的ASCII码的差的绝对值,而空格字符与其它任意...
5. **动态规划**:在字符串问题中,动态规划常用于解决最短编辑距离(Levenshtein Distance)、最长公共子序列(Longest Common Subsequence)等。这些问题可以通过构建二维状态转移表来解决,从而找出最优解。 6. ...
- 通过动态规划的方式建立二维矩阵,矩阵的每个元素表示两个子字符串之间的编辑距离。 #### 五、综合演练 **6.1 海量数据处理** - **知识点概述**: 处理海量数据的技术。 - **关键方法**: - MapReduce:分布式...
介绍Levenshtein Python C 扩展模块包含用于快速计算的函数Levenshtein(编辑)距离和编辑操作字符串相似度近似中位数字符串,以及一般字符串平均值字符串序列和集合相似度它同时支持普通字符串和 Unicode 字符串。...
字符串匹配是计算机科学中的一个核心问题,在文本处理、搜索引擎、生物信息学等多个领域都有着广泛的应用。下面将从不同的角度来深入解读这一主题,并尽可能地扩展相关知识点。 ### 一、字符串匹配简介 #### 1.1 ...
在动态规划解决LCS问题时,我们通常定义一个二维数组`dp`,其中`dp[i][j]`表示字符串S1的前i个字符与字符串S2的前j个字符之间的最长公共子序列的长度。初始情况下,如果i或j为0,那么`dp[i][j]`的值应为0,因为一个...