栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

基础算法题 —— 计算字符串的编辑距离(动态规划)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基础算法题 —— 计算字符串的编辑距离(动态规划)


题解

在题目所求的编辑距离是指字符串 a 转换成字符串 b 所需最小的操作步骤。
a[i] != b[j] 时,要使 a[i] == b[j] 可使用的操作步骤如下:
①、a[i] 可替换成 b[j]。
②、字符串 a 下标为 i 的位置插入字符 b[j],a[i+1] = 原a[i]…。
③、字符串 b 下标为 j 的位置插入字符 a[i],b[j+1] = 原b[j]…。

由于字符串可以通过“插入”字符的操作进行改变,要得到相同的两个字符串就要从串头到串尾进行匹配。利用这一特点我们可以利用动态规划的思路来解决。

①、创建 dp 二维数组,在 a、b 字符串头插入两个特殊字符,便于进行 dp 数组初始化。
②、当 a[i] == b[j] 时,不用操作,dp[i][j] = dp[i-1][j-1]
③、当 a[i] != b[j] 时, 需要操作,dp[i][j] = min{dp[i-1][j], dp[i][j-1], dp[i-1][j-1]} + 1

代码
#include
#include
using namespace std;

int main() {
	string s1, s2;
	int k;
	cin>>s1>>s2;
	s1.insert(0, 1, ' ');    //在字符串s1下标0位置插入1个' '字符
	s2.insert(0, 1, ' ');
	int len1 = s1.length();
	int len2 = s2.length();
	
    int dp[len1+1][len2+1];
	for(int i=0; i
		for(int j=1; j
            s1[i]==s2[j] ? k = 0 : k = 1;   
			dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1;
			dp[i][j] = min(dp[i][j], dp[i-1][j-1]+k);
		}
	}
	cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/965808.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号