#include <iostream>
using namespace std;
//为了方便,将a和b的长度固定下来,这样就不用动态创建数组了
#define M 6
#define N 3
int dp[M][N] = {0};
/**
* 问题描述: 两个字符串如果可以根据添加,删除,修改一个字符串来变成另一个字符串,则
* 说这两个字符串距离为1. 现在给出两个字符串,求出他们之间的距离。
* abcehk和bdh的距离。
* 要将一个字符串变成另一个,这里假设将B变换成A,很明显这个问题有子结构。
* 要求f(m,n),即字符串A与字符串B的距离:
* 如果a[m] == b[n],那么这个距离就是其上一个状态,即f(m-1,n-1)。
* 如果a[m] != b[n],
* 要么删除b[n],这个时候问题变成f(m,n-1)
* 要么为B增加一个和a[m]相同的字符让其与A的结尾相同,这个时候问题变成f(m,n+1) = f(m-1,n)(因为末尾字符相同,故不考虑)。
* 要么修改b[n]为a[m],这个时候问题变成求解f(m-1.n-1).
* 这些操作的代价都是1,主要是看子问题的代价,选择最小的。(DP特征)
*
* 所以我们定义状态f(m,n)为长度为m的串A与长度为n的串B之间的距离。
* 然后定义状态转移方程为:
* f(m,n) =
* f(m-1,n-1), a[m] == b[n]
* min{f(m-1,n-1),f(m,n-1),f(m-1,n)}+1, a[m]!=b[n]
* 自底向上求解,DP求解矩阵的第一行和第一列很容易初始化.
*/
int min(int x, int y, int z){
if(x<y){
if(x<z) return x;
else return z;
}
else{
if(y<z) return y;
else return z;
}
}
int getDistance(char *a, char *b){
if(a==NULL || b==NULL) return 0;
//初始化两个字符串的长度
int a_len=M,b_len=N;
//初始化第一行和第一列
if(a[0] != b[0]) dp[0][0] = 1;
else dp[0][0] = 0;
for(int i=1;i<b_len;i++){ //第一行
if(a[0] != b[i]) dp[0][i] = dp[0][i-1]+1;
else dp[0][i] = dp[0][i-1];
}
for(int j=1;j<a_len;j++){ //第一列
if(b[0] != a[j]) dp[j][0] = dp[j-1][0]+1;
else dp[j][0] = dp[j-1][0];
}
//开始自底向上计算
for(i=1;i<a_len;i++){
for(j=1;j<b_len;j++){
if(a[i] == b[j]) dp[i][j] = dp[i-1][j-1];
else{
dp[i][j] = min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j])+1;
}
}
}
//打印出最短距离数组
for(i=0;i<a_len;i++){
for(j=0;j<b_len;j++){
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
return dp[M-1][N-1];
}
int main(){
/**
* 注意顺序,这里a作为列,b作为行
*/
char *a = "abcehk";
char *b = "beh";
cout<<getDistance(a,b)<<endl;
return 0;
}
分享到:
相关推荐
这个算法主要用于衡量两个字符串之间的差异,即需要进行多少次单字符操作(插入、删除或替换)才能将一个字符串转换为另一个字符串。在文本处理、信息检索、生物信息学等领域有着广泛的应用。 字符串相似度是评估两...
返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。 示例 : 输入: S = "loveleetcode", C = 'e' 输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0] 说明: - 字符串 S 的长度范围...
这个题目关注的是如何找出字符串中字符之间的最短距离。LeetCode是一个非常知名的在线编程挑战平台,它提供了大量的算法题目,帮助开发者提升编程技能和算法理解能力。 在PHP与LeetCode的结合中,我们可以学到以下...
这个实验的目的是帮助学习者掌握C语言中的字符串操作、循环结构以及问题解决策略。 首先,我们要了解C语言中的字符类型。在C语言中,字符是以`char`类型表示的,它占用1个字节的内存空间,可以存储ASCII码表中的...
使用修改后的 Vagner-Fischer 算法找到每对字符串之间的 Levenshtein 距离。 逐步缩小阈值以等于目前找到的最佳匹配的距离,从而减少运行时间。 更新以更正算法。 (对不起!) 可选行为包括上限阈值距离、检测第...
具体来说,这个任务是计算一个关键字字符串与一组字符串之间的最短距离,以便找到最近的匹配项。下面我们将深入探讨这一主题。 首先,我们需要理解“最短距离”通常指的是编辑距离(Levenshtein Distance),它定义...
如果问题是最短编辑距离问题,即计算两个字符串之间达到相同所需的最少编辑操作(插入、删除或替换),则可以使用Levenshtein距离算法。该算法利用二维数组构建动态规划矩阵,逐个比较两个字符串的字符,最终得到...
编辑距离矩阵在java代码中的应用,实现算出2个字符串之间的编辑最短距离,从而算出从原始字符串到新的字符串之间的操作,包括增加,删除,最后给每个字符附上编辑信息,最终可以在页面上展示出编辑痕迹
10. **图论**:在构建字符串之间的关系时,图论概念如图的遍历、最短路径等也可能被应用到。 通过学习和理解这些算法,不仅可以在ACM竞赛中取得优势,也能提高实际编程工作中处理字符串问题的能力。这个压缩包提供...
题目要求在一个字符串(由空格分隔的单词)中找到两个特定单词之间的最短距离。例如,如果输入字符串为"hello world hi world",且目标单词是"world"和"hi",则最短距离为1。在解决这个问题时,我们需要考虑以下关键...
而“深入学习字符串”可能是指利用字符串处理技术来解决路径规划问题中的数据处理和搜索算法。 MATLAB提供了强大的数学和计算工具,使其成为路径规划的理想平台。在城市遍历问题中,我们可以利用图论方法,如...
这个算法的核心在于动态规划,它解决了如何在两个字符串之间找到最短的编辑路径的问题。《算法导论》是一本经典的计算机科学教材,其中详细介绍了这个算法及其背后的数学原理。 具体来说,编辑距离算法通常通过一个...
这个问题涉及到的是计算两个字符串之间的最短编辑距离,这是一个在文本处理、字符串比较和生物信息学等领域常见的问题。在UNIX系统中,行编辑器ed提供了一个实际的应用场景,它允许对文本进行基本的字符操作。 标签...
标题中的"解题思路27"可能是指一系列编程或算法问题的编号,而这个特定的问题是关于计算两个字符串之间的最短编辑距离。描述中详细阐述了这个问题的具体要求和背景。 在UNIX系统中,存在一个叫做ed的行编辑器,它...
graph图,节点之间的最短距离 两个字符串的最大子字符串 判断一个链表是否有环 将数字字符串转成整数 走台阶问题 计算回文字符串 字符串反转 字符串模式匹配 字符串前缀匹配 字典trie匹配 最大连续字符串 字符串压缩...
在这个例子中,这个`calculateEditDistance`函数接收两个字符串`s1`和`s2`,并返回它们之间的编辑距离。通过使用二维数组`dp`来存储中间结果,避免了重复计算。在双重循环中,我们比较当前字符是否相等,然后根据...
Python中的Floyd算法是一种用于寻找图中所有顶点对之间最短路径的算法。它基于三角不等式原理,即若存在三个顶点A、B和C,那么从A到B的最短路径可能经过C,也可能不经过C。通过迭代的方式,Floyd算法检查所有可能的...
这个类的主要功能包括读取文件、构建一个哈希映射(HashMap)来存储每个单词及其在文本中的位置,并计算两个指定单词之间的最短距离。以下是对各个部分的详细解释: 1. **哈希映射(HashMap)**:`wordMap`是一个...
ID:通常需要在较长的字符串中找到最短或最长的某个部分 * 有时从前面和后面开始(陷阱水),其他时候从前面和一英寸开始* 运行最大问题和线性 dp * ID:通常需要从整数数组中找到某事物的最大值或最小值 * 示例:...
图中的顶点是通过字符串`vexs`数组表示的,每个元素都是一个站点的名称。 在解决问题之前,需要对图进行初始化。`InitGraph`函数接收顶点列表`vexs`,并创建一个表示图的结构体`MGraph`。在初始化过程中,所有的...