采用动态递归的方法

#include <stdio.h>
#include <string.h>

char s1[1001] = {0};
char s2[1001] = {0};

#define MIN(a,b) (a<b?a:b)
#define MAX(a,b) (a>b?a:b)

int dp[1001][1001] = {0};

int dis_levenshtein(int i, int j) {
    int min;

    if (*(s1 + i - 1) == *(s2 + j - 1)) {
        return dp[i - 1][j - 1];
    } else 
    {
        min = MIN(MIN(dp[i - 1][j - 1], dp[i - 1][j]), dp[i][j - 1]);
        return min + 1;
    }
}


int main() {

    while (scanf("%s", s1) != EOF) {
        scanf("%s", s2);
        
        for(int i=0; i<= strlen(s1); i++){
            dp[i][0] = i;
        }
        for(int j=0; j<= strlen(s2); j++){
            dp[0][j] = j;
        }

        for (int i = 1; i <= strlen(s1); i++) {
            for (int j = 1; j <= strlen(s2); j++) {
                dp[i][j] = dis_levenshtein(i, j);
            }
        }

        printf("%d\n", dp[strlen(s1)][strlen(s2)]);
    }



    return 0;
}

以下方法便于理解,但是复杂度太高

#include <stdio.h>
#include <string.h>

char s1[1001] = {0};
char s2[1001] = {0};

#define MIN(a,b) (a<b?a:b)
#define MAX(a,b) (a>b?a:b)

int dis_levenshtein(int i, int j) {

    int len1 = strlen(s1 + i);
    int len2 = strlen(s2 + j);
    if (MIN(len1, len2) == 0) {
        return MAX(len1, len2);
    }

    if (s1[i] == s2[j]) {
        return dis_levenshtein(i + 1, j + 1);
    } else {
        int d1 = dis_levenshtein(i + 1, j); //add a char in s2
        int d2 = dis_levenshtein(i, j + 1); //delete a char in s2
        int d3 = dis_levenshtein(i + 1, j + 1); //modify a char in s2
        return MIN(MIN(d1, d2), d3) + 1;
    }
}

int main() {

    while (scanf("%s", s1) != EOF) {
        scanf("%s", s2);
        printf("%d\n", dis_levenshtein(0,0));
    }

    return 0;
}