细节
#define reads(str) scanf("%s",str+1)
不好,函数名体现不出从一开始,不如写成直觉的那种- 注意初始化首行首列要包括边界值
-
f[i][j]=min(min(f[i-1][j]+1,f[i][j-1]+1),f[i-1][j-1]+(a[i]!=b[j]));
从两个字符串末尾理解这个式子- 目标串j和原串i-1完全匹配,原串需要末尾替换一次
- 目标串j-1和原串i完全匹配,原串需要末尾插入一次
- 目标串j-1和原串i-1全匹配,末尾若不同要删除一次
-
与while相关的变量定义在附近,比如while头顶就很好
C++ 代码
#include<iostream>
#include<cstring>
using namespace std;
#define ffor(i,s,e) for(int i=s;i<e;i++)
#define reads(str) scanf("%s",str)
const int N=1003;
int f[N][N];
int n,m;
char dict[N][12];
int dis(char a[],char b[]){
int la=strlen(a+1),lb=strlen(b+1);
ffor(i,0,la+1) f[i][0]=i;
ffor(j,0,lb+1) f[0][j]=j;
ffor(i,1,la+1)ffor(j,1,lb+1){
f[i][j]=min(min(f[i-1][j]+1,f[i][j-1]+1),f[i-1][j-1]+(a[i]!=b[j]));
}
return f[la][lb];
}
int main(){
cin>>n>>m;
ffor(i,0,n) reads(dict[i]+1);
char word[12];
int limit;
while(m--){
scanf("%s %d",word+1,&limit);
int ans=0;
ffor(i,0,n) if(dis(dict[i],word)<=limit) ans++;
cout<<ans<<endl;
}
return 0;
}