AcWing 899. 编辑距离

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

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

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

#include<bits/stdc++.h>
#define N 1010
using namespace std;
int f[N][N];
int n,m;
string s1,s2;
int main()
{
    cin>>n>>s1;
    cin>>m>>s2;
	for(int i=1;i<=n;i++)f[i][0]=i;
	for(int i=1;i<=m;i++)f[0][i]=i; 
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            f[i][j]=min(f[i-1][j],f[i][j-1])+1;
            if(s1[i-1]==s2[j-1])f[i][j]=min(f[i][j],f[i-1][j-1]);
            else f[i][j]=min(f[i][j],f[i-1][j-1]+1);
        }
    cout<<f[n][m];
    return 0;
}

 

1)删除操作:把a[i]删掉之后a[1~i]和b[1~j]匹配
            所以之前要先做到a[1~(i-1)]和b[1~j]匹配,f[i][j]= f[i-1][j] + 1
2)插入操作:插入之后a[i]与b[j]完全匹配,所以插入的就是b[j]
            那填之前a[1~i]和b[1~(j-1)]匹配,f[i][j]=f[i][j-1] + 1
3)替换操作:把a[i]改成b[j]之后想要a[1~i]与b[1~j]匹配
            那么修改这一位之前,a[1~(i-1)]应该与b[1~(j-1)]匹配, f[i][j]= f[i-1][j-1] + 1
            但是如果本来a[i]与b[j]这一位上就相等,那么不用改,f[i][j]=f[i-1][j-1]

posted @ 2020-12-13 16:50  君与  阅读(88)  评论(0)    收藏  举报