AcWing 899. 編輯距離
阿新 • • 發佈:2020-12-13
給定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]