编辑距离

来源:互联网 发布:获取intent数据 编辑:程序博客网 时间:2024/06/01 08:45

问题:

给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。

    你总共三种操作方法:

        插入一个字符

        删除一个字符

        替换一个字符

解题思路:

        典型的动态规划问题,用 dp[i][j] 表示 word1 和 word2 中以 i,j 结尾的子串的编辑距离, 如果 word1[i] == word2[j],dp[i][j] = dp[i - 1][j - 1], 否则

dp[i][j]  = 1 + min(dp[i][j - 1],min(dp[i - 1][j],dp[i - 1][j - 1]))

 int minDistance(string word1, string word2) {        // write your code here        int row = word1.length();        int col = word2.length();                if(row == 0 && col == 0){            return 0;        }        if(row == 0){            return col;        }        if(col == 0){            return row;        }                int ** cache = new int*[row];        for(int i = 0; i < row; i++){            cache[i] = new int[col];        }                for(int i = 0; i < row; i++){            for(int j = 0; j < col; j++){                cache[i][j] = 0;            }        }                cache[0][0] = word1[0] == word2[0] ? 0 : 1;                for(int i = 1; i < row; i++){            cache[i][0] = word1[i] == word2[0] ? i : 1 + cache[i - 1][0];        }                for(int i = 1; i < col; i++){            cache[0][i] = word1[0] == word2[i] ? i : 1 + cache[0][i - 1];        }                for(int i = 1; i < row; i++){            for(int j = 1; j < col; j++){                if(word1[i] == word2[j]){                    cache[i][j] = cache[i - 1][j - 1];                }else {                    cache[i][j] = 1 + min(cache[i - 1][j], min(cache[i][j - 1], cache[i - 1][j - 1]));                }            }        }                return cache[row - 1][col - 1];    }

 


0 0
原创粉丝点击