近似串匹配问题(动态规划)

这篇具有很好参考价值的文章主要介绍了近似串匹配问题(动态规划)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.问题描述
近似串匹配问题(动态规划)
2.思路分析
两个字符串文本P和样本T,对齐方式不一样则差别数不一样,编辑距离是最小差别数。
根据上课讲的两个例子最长公共子序列和背包问题类比分析,这两个问题都是从最后开始分析的,最长公共子序列分为最后一位相同和最后一位不同的情况,背包问题分为不放最后一个物品和放最后一个物品的情况。
该题目可以分为最后一位相同和不相同的情况,样本P:p1 p2 … pi,文本T:t1 t2 … tj,最后一位的对齐方式有三种,
第一种:p1 p2 … pi pi不等于tj则有删除操作,差别数+1
t1 t2 … tj
第二种:p1 p2 … pi-1 pi 插入操作,差别数+1
t1 t2 … tj
第三种:p1 p2 … pi
t1 t2 … tj-1 tj 删除操作,差别数+1
设从pi到tj的最小差别数是num(i,j)
则有递推关系
pi=tj时,num(i,j)=min{ num(i-1,j-1), num(i-1,j)+1, num(i,j-1)+1}
pi≠tj时,num(i ,j)=min{ num(i-1,j-1)+1, num(i-1,j)+1, num(i,j-1)+1}
边界条件是,num(0,j)=j 执行j次删除
num(i,0)=i 执行i次插入

填充矩阵。
3.递推实现:

#include <iostream>
#include <string>
using namespace std;
//三个数取最小
int getMin(int a, int b, int c) {
	if (a < b && a < c)
		return a;
	if (b < a && b < c)
		return b;
	return c;
}
int main() {
	char p[12] = {'a', 'p', 'p', 'r', 'o', 'x', 'i', 'm', 'a', 't', 'l', 'y'};
	char t[12] = {'a', 'p', 'r', 'o', 'x', 'i', 'o', 'm', 'a', 'l', 'l', 'y'};
	int num[20][20] = {0};
	int m = sizeof(p);
	int n = sizeof(t);
	//根据边界值填充, num(i,0)=i num(0,j)=j
	for (int i = 1; i <= m; i++)
		num[i][0] = i;
	for (int j = 1; j <= n; j++)
		num[0][j] = j;
	//根据递推关系式
	for (int j = 1; j <= n; j++) {
		for (int i = 1; i <= m; i++) {
			if (p[i - 1] == t[j - 1]) { //如果最后一个字符相同
				num[i][j] = getMin(num[i - 1][j - 1], num[i - 1][j] + 1, num[i][j - 1] + 1);
			} else {
				num[i][j] = getMin(num[i - 1][j - 1] + 1, num[i - 1][j] + 1, num[i][j - 1] + 1);
			}
		}
	}
	//输出矩阵
	for (int i = 0; i <= m; i++) {
		for (int j = 0; j <= n; j++) {
			cout << num[i][j] << "  ";
		}
		cout << endl;
	}
	cout << "两个字符串编辑距离是:" << num[m][n];
	return 0;
}

输出结果:

4

递归实现:文章来源地址https://www.toymoban.com/news/detail-497388.html

#include <iostream>
using namespace std;

//char p[5] = {'h', 'a', 'p', 'p', 'y'};
//char t[6] = {'h', 's', 'p', 'p', 'a', 'y'};
char p[12] = {'a', 'p', 'p', 'r', 'o', 'x', 'i', 'm', 'a', 't', 'l', 'y'};
char t[12] = {'a', 'p', 'r', 'o', 'x', 'i', 'o', 'm', 'a', 'l', 'l', 'y'};
int a[20][20] = {0};
int m = sizeof(p);
int n = sizeof(t);

//三个数取最小
int getMin(int a, int b, int c) {
	if (a < b && a < c)
		return a;
	if (b < a && b < c)
		return b;
	return c;
}
//给数组num[][]赋值
int getRes(int i, int j) {
	if (j == 0)
		return i;
	else if (i == 0)
		return j;
	else if (p[i - 1] == t[j - 1])
		return getMin(getRes(i - 1, j - 1), getRes(i - 1, j) + 1, getRes(i, j - 1) + 1);
	else
		return getMin(getRes(i - 1, j - 1) + 1, getRes(i - 1, j) + 1, getRes(i, j - 1) + 1);

}
int main() {
	cout << getRes(m, n);
}

到了这里,关于近似串匹配问题(动态规划)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【动态规划】通配符匹配与正则表达式匹配

    题目描述: 给你一个输入字符串 (s) 和一个字符模式 § ,请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符匹配: ‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而

    2024年02月07日
    浏览(46)
  • 44. 通配符匹配(动态规划)

    Problem: 44. 通配符匹配 给你一个输入字符串 (s) 和一个字符模式p ,请你实现一个支持 ‘?’ 和 ‘ ’ 匹配规则的通配符匹配: ‘?’ 可以匹配任何单个字符。 \\\' ’ 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符

    2024年02月04日
    浏览(43)
  • 动态规划--通配字符串匹配

    1. 题目来源 链接:通配符匹配 来源:LeetCode 2. 题目说明 给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。 ‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符串(包括空字符串)。 两个字符串完全匹配才算匹配成功。 说明: s 可能为

    2024年02月14日
    浏览(35)
  • leetcode-动态规划-44-通配符匹配

    给你一个输入字符串 (s) 和一个字符模式 § ,请你实现一个支持 ‘?’ 和 ‘ ’ 匹配规则的通配符匹配: ‘?’ 可以匹配任何单个字符。 \\\' ’ 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配

    2024年02月12日
    浏览(42)
  • 动态规划学习——通符串匹配,正则表达式

    目录 ​编辑 一,通符串匹配 1.题目 2.题目接口 3,解题思路及其代码 二,正则表达  1.题目 2.题目接口 3.解题思路及其代码 三,交错字符串  1.题目 2,题目接口 3.解题思路及其代码 1.题目 给你一个输入字符串 ( s ) 和一个字符模式 ( p ) ,请你实现一个支持  \\\'?\\\'  和  \\\'*\\\'  匹

    2024年02月03日
    浏览(27)
  • 动态规划:LeetCode第10题 正则表达式匹配

    给你一个字符串  s  和一个字符规律  p ,请你来实现一个支持  \\\'.\\\'  和  \\\'*\\\'  的正则表达式匹配。 \\\'.\\\'  匹配任意单个字符 \\\'*\\\'  匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖  整个  字符串  s 的,而不是部分字符串。 1 = s.length = 20 1 = p.length = 20 s  只包含从 

    2024年04月11日
    浏览(22)
  • 【动态规划】【字符串】C++算法:正则表达式匹配

    视频算法专题 动态规划汇总 字符串 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘ ’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 \\\' ’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 示例 1: 输入:

    2024年02月03日
    浏览(44)
  • 【LeetCode: 44. 通配符匹配 | 暴力递归=>记忆化搜索=>动态规划 】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月06日
    浏览(48)
  • 动态规划详解(完结篇)——如何抽象出动态规划算法?以及解题思路

    今天直接开始讲解 FIRST:如何抽象出动态规划算法? 这个问题,困扰了无数代OIER,包括本蒟蒻 在比赛的时候,看一道题,怎么想到他是什么算法的呢? 这就需要抽象能力 而不同的算法,往往有着不同的特点 就来说说动态规划的题目特点 通过遍历,能够把所有的情况考虑到

    2023年04月08日
    浏览(30)
  • 【动态规划】最强最详细的思路及模板(C++)

    本文根据力扣动态规划精讲(一)(二)(三)的框架编写。 动态规划精讲(一) - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 目录 一 动态规划问题的特征 1.1 重叠子问题:子问题反复出现(递归树可以很清晰地看出) 1.2 最优子结构 1.3 贪心和动态规划的区别

    2024年02月08日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包