当前位置: 首页 > news >正文

题解:AcWing 899 编辑距离

【题目来源】

AcWing:899. 编辑距离 - AcWing题库

【题目描述】

给定 \(n\) 个长度不超过 \(10\) 的字符串以及 \(m\) 次询问,每次询问给出一个字符串和一个操作次数上限。

对于每次询问,请你求出给定的 \(n\) 个字符串中有多少个字符串可以在上限操作次数内经过操作变成询问给出的字符串。

每个对字符串进行的单个字符的插入、删除或替换算作一次操作。

【输入】

第一行包含两个整数 \(n\)\(m\)

接下来 \(n\) 行,每行包含一个字符串,表示给定的字符串。

再接下来 \(m\) 行,每行包含一个字符串和一个整数,表示一次询问。

字符串中只包含小写字母,且长度均不超过 \(10\)

【输出】

输出共 \(m\) 行,每行输出一个整数作为结果,表示一次询问中满足条件的字符串个数。

【输入样例】

3 2
abc
acd
bcd
ab 1
acbd 2

【输出样例】

1
3

【解题思路】

image

image

image

【算法标签】

《AcWing 899 编辑距离》 #动态规划# #线性DP#

【代码详解】

// 引入所有标准库头文件,方便使用各种标准库功能
#include <bits/stdc++.h>// 使用标准命名空间,避免每次使用标准库函数时都需要加 std:: 前缀
using namespace std;// 定义常量
const int N = 1005;  // 定义数组的最大尺寸为1005,以适应字符串长度的需求// 定义全局变量
int n, m;            // n: 字符串的数量,m: 询问的次数
char str[N][N];      // str[N][N]: 存储输入的n个字符串,每个字符串的字符下标从1开始存放
int f[15][15];       // f[i][j]: 表示将字符串a的前i个字符转换成字符串b的前j个字符所需的最小操作数// 函数声明:计算将字符串a转换成字符串b的编辑距离
int edit_dis(char a[], char b[]);  // 求a[]变换到b[]的编辑距离// 主函数,程序的入口点
int main()
{// 读取字符串的数量n和询问的次数mcin >> n >> m;// 循环读取n个字符串,每个字符串的字符下标从1开始存放for (int i = 0; i < n; i++)  cin >> str[i] + 1;// 处理m次询问while (m--) {// 定义临时字符数组s,用于存储询问的目标字符串,字符下标从1开始存放char s[15];  // 定义变量lim,表示允许的最大编辑距离int lim;// 读取询问的目标字符串s和允许的最大编辑距离lim,字符下标从1开始存放cin >> s + 1 >> lim;// 初始化结果变量res,用于统计满足编辑距离限制的字符串个数int res = 0;  // 遍历所有n个字符串,统计编辑距离不超过lim的字符串数量for (int i = 0; i < n; i++)  // 如果字符串str[i]转换成字符串s的编辑距离小于等于lim,则计数加1if (edit_dis(str[i], s) <= lim) res++;// 输出满足条件的字符串个数cout << res << endl;}// 程序正常结束,返回0return 0;
}// 函数定义:计算将字符串a转换成字符串b的编辑距离
int edit_dis(char a[], char b[])  // 求a[]变换到b[]的编辑距离
{// 计算字符串a和字符串b的长度,字符下标从1开始存放int la = strlen(a + 1), lb = strlen(b + 1);  // a、b存放起始地址是1,不是0// 初始化动态规划数组f的第一行,表示将0个a字符转换成b的前i个字符所需的操作数for (int i = 0; i <= lb; i++)  f[0][i] = i;  // 表示0个a数组字符变到b数组i个字符步骤// 初始化动态规划数组f的第一列,表示将a的前i个字符转换成0个b字符所需的操作数for (int i = 0; i <= la; i++)  f[i][0] = i;  // 表示i个a数组字符变到b数组0个字符步骤// 动态规划计算将字符串a的前i个字符转换成字符串b的前j个字符所需的最小操作数for (int i = 1; i <= la; i++)  for (int j = 1; j <= lb; j++) {// 如果当前字符a[i]和b[j]相等,则不需要进行操作,直接继承前一个状态if (a[i] == b[j]) f[i][j] = f[i - 1][j - 1];  // 不需要操作else {// 如果当前字符a[i]和b[j]不相等,则需要进行以下三种操作中的一种,并选择最小操作数// 1. 删除a[i]: f[i-1][j] + 1// 2. 在a[i]后插入b[j]: f[i][j-1] + 1// 3. 替换a[i]为b[j]: f[i-1][j-1] + 1f[i][j] = min(min(f[i - 1][j], f[i][j - 1]), f[i - 1][j - 1]) + 1;}}// 返回将字符串a转换成字符串b所需的最小编辑操作数return f[la][lb];
}

【运行结果】

3 2
abc
acd
bcd
ab 1
1
acbd 2
3
http://www.jsqmd.com/news/409975/

相关文章:

  • zerofs 支更多兼容s3服务了
  • 十家品牌全案公司推荐:大定位理论+年度全案陪跑(避坑攻略) - 品牌排行榜
  • JAVA面试题速记-mysql基础
  • 题解:AcWing 5 多重背包问题 II
  • 题解:AcWing 9 分组背包问题
  • 题解:AcWing 4 多重背包问题 I
  • 莱博雷生Lemborexant治疗失眠症的标准睡前给药方案与次日嗜睡风险评估
  • 七里海潮汐表查询2026-02-26
  • 题解:AcWing 894 拆分-Nim游戏
  • 题解:AcWing 892 台阶-Nim游戏
  • Photoroom 2026.08.04 | 法国大厂出品,高质量无限AI生图,最强电商作图
  • 随心听书 2.0.2 | 电子书听书神器,内置微软语音,堪比真人
  • stm32死锁是怎么实现的
  • stm32最级别的烧录解锁是什么?
  • Agentic AI:自主决策的新范式
  • 2026优质的汽车涂装废水处理企业推荐 - 品牌排行榜
  • 2026哪个品牌的袋式过滤器好?行业口碑推荐 - 品牌排行榜
  • Microsoft Agent Framework 取出 DeepSeek 思考内容
  • 从基础到实战:Java全栈开发工程师的面试实录
  • 服务效率提升实战:排队理论与多场景仿真案例
  • 安装开发环境
  • 深入解析Stable Diffusion核心组件:超越基础文本到图像的内部机制
  • 避免在 onbind 方法调用 getCallingUid 与 getCallingPid 方法
  • 好用的skills清单
  • 在 Android Studio 中,新建 AIDL 文件按钮是灰色
  • Android 开发问题:The direction of ‘data‘ is not specified. array can be an in, out, or inout parameter.
  • Android 多进程开发 - AIDL 回调、RemoteCallbackList、AIDL 安全校验
  • 为什么 Controller 层坚决不能直接调 DAO 层?
  • Redis 的 ZipList 是什么?它是怎么解决内存碎片问题的?
  • 小遥搜索v1.2.0版本更新【已支持-语雀数据源集成】