11.编辑距离

 时间复杂度1000 * 1000 * 100

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 15, M = 1010;
 4 int n, m;
 5 char str[M][N];
 6 int dp[N][N];
 7 int edit_distance(char str[], char s[]) {
 8     int la = strlen(str + 1), lb = strlen(s + 1);
 9     for (int i = 0; i <= lb; i++) {
10         dp[0][i] = i;
11     }
12     for (int i = 0; i <= la; i++) {
13         dp[i][0] = i;
14     }
15     for (int i = 1; i <= la; i++) {
16         for (int j = 1; j <= lb; j++) {
17             dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
18             dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + (str[i] != s[j]));
19         }
20     }
21     return dp[la][lb];
22 }
23 int main() {
24     cin >> n >> m;
25     for (int i = 1; i <= n; i++) {
26         cin >> str[i] + 1;
27     }
28     while (m--) {
29         char s[N];
30         int limit;
31         cin >> s + 1 >> limit;
32         int cnt = 0;
33         for (int i = 1; i <= n; i++) {
34             if (edit_distance(str[i], s) <= limit) {
35                 cnt++;
36             }
37         }
38         cout << cnt << endl;
39     }
40     return 0;
41 }

 

posted @ 2020-07-03 21:24  kyk333  阅读(163)  评论(0)    收藏  举报