动态规划之编辑距离(接上一个题)

简介: 动态规划之编辑距离(接上一个题)

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


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


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


输入格式

第一行包含两个整数 n 和 m。


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


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


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


输出格式

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


数据范围

1≤n,m≤1000

输入样例:
1. 3 2
2. abc
3. acd
4. bcd
5. ab 1
6. acbd 2
输出样例:
1. 1
2. 3

思路可以看上面这篇:

最短编辑问题

#include<iostream>
#include<string.h>
 
using namespace std;
 
const int N=15,M=1010;
int f[N][N],x;
char str[M][N],a[N];
 
int main(){
    //输入
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>str[i]+1;
    }
 
    //询问
    while(m--){
        cin>>a+1>>x;
        int res=0;
        //遍历每个字符串
        for(int i=1;i<=n;i++){
            int la=strlen(str[i]+1),lb=strlen(a+1);//获取字符串长度
            //边界初始化
            for(int j=1;j<=la;j++) f[j][0]=j;
            for(int j=1;j<=lb;j++) f[0][j]=j;
            //DP
            for(int j=1;j<=la;j++){
                for(int k=1;k<=lb;k++){
                    f[j][k]=min(f[j-1][k]+1,f[j][k-1]+1); //f[i][j]每次会被f[i-1][j]与f[i][j-1]无条件覆盖,最开始会被f[1][0]与f[0][1]覆盖,因为边界初始化了,内部就会无条件跟着初始化
                    if(str[i][j]==a[k]) f[j][k]=min(f[j][k],f[j-1][k-1]);
                    else f[j][k]=min(f[j][k],f[j-1][k-1]+1);
                }
            }
            // 判断是否符合limit
            if(f[la][lb]<=x) res++;
        }
        cout << res <<endl ;
    }
    return 0;
}


相关文章
|
9月前
|
算法
代码随想录 Day26 贪心算法01 中 LeetCode T376 摆动序列
代码随想录 Day26 贪心算法01 中 LeetCode T376 摆动序列
33 1
|
12天前
|
存储
【洛谷 P1255】数楼梯 题解(递归+记忆化搜索+高精度)
这是一个使用动态规划解决的“数楼梯”问题。给定楼梯数`N`,求不同上楼方式的数量。程序通过递归函数`f()`计算,其中`f(x) = f(x - 1) + f(x - 2)`,初始条件`f(1) = 1`,`f(2) = 2`。考虑到数据规模可能很大,使用了高精度加法运算。样例输入`4`,输出`5`。代码中定义了一个存储中间结果的向量`mem`,并提供了一个用于显示高精度数的`printv()`函数。
8 0
|
22天前
|
存储 算法 数据可视化
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
|
12天前
|
存储 C++
【洛谷 P1102】A-B 数对 题解(映射)
这是一个编程题目,要求计算给定正整数序列中满足 \( A - B = C \) 的数对个数。输入包含两行:正整数 \( N \) 和 \( C \),以及一串正整数。使用一个哈希映射记录每个数字出现的次数,然后遍历映射,如果找到 \( A = B + C \),则累加对应计数。样例输入输出为 \( N=4, C=1 \),数列为 \( 1 1 2 3 \),答案为 \( 3 \)。代码使用 C++ 实现,通过维护一个映射来存储数字频率并计算数对。
5 0
|
2月前
|
存储 算法
数字三角形(很经典的动态规划问题)
数字三角形(很经典的动态规划问题)
|
2月前
leetcode代码记录(动态规划基础题(斐波那契数列)
leetcode代码记录(动态规划基础题(斐波那契数列)
17 0
|
2月前
代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和
代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和
43 0
|
2月前
代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集
代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集
29 0
|
9月前
|
算法
代码随想录Day23 回溯算法 LeetCode T93 复原ip地址 LeetCode T78子集 LeetCode T90 子集II
代码随想录Day23 回溯算法 LeetCode T93 复原ip地址 LeetCode T78子集 LeetCode T90 子集II
26 0
|
算法 C++
每日算法系列【LeetCode 376】摆动序列
每日算法系列【LeetCode 376】摆动序列