【DP】编辑距离

来源:互联网 发布:windows无法连接到cmcc 编辑:程序博客网 时间:2024/05/21 17:27

题目描述


Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character


哇终于在DP上找到点感觉!
dist[i][j]表示word1 1~i通过dist[i][j]种次操作变到word2 1~j。
当word1.charat(i) == word2.charat(j)时,dist[i][j] = dist[i - 1][j - 1];
否则,有三种选择:
1)如果dist[i - 1][j]最小,则dist[i][j] = dist[i - 1][j] + 1(word1末尾的一次删除操作);
2)如果dist[i - 1][j - 1]最小,则dist[i][j] = dist[i - 1][j - 1] + 1(word1末尾的字符替换成word2末尾的字符);
3)如果dist[i][j - 1]最小,则dist[i][j] = dist[i][j - 1] + 1(说明这次的word2的末尾字符插入到word1末尾即可);

public class Solution {    public int minDistance(String word1, String word2) {                if(word1.equals("") || word2.equals(""))            return word1.equals("") ? word2.length():word1.length();                int len1 = word1.length() + 1;        int len2 = word2.length() + 1;                int [][] dist = new int [len1][len2];        dist[0][0] = 0;                for(int i = 1; i < len1; ++i)            dist[i][0] = i;                for(int i = 1; i < len2; ++i)            dist[0][i] = i;                for(int i = 1; i < len1; ++i){            for(int k = 1; k < len2; ++k){                if(word1.charAt(i - 1) == word2.charAt(k - 1)){                    dist[i][k] = dist[i - 1][k - 1];                }else{                    int temp = dist[i - 1][k] > dist[i - 1][k - 1]? dist[i - 1][k - 1] : dist[i - 1][k];                    int min = temp > dist[i][k - 1]? dist[i][k - 1] : temp;                    dist[i][k] = min + 1;                }            }        }        return dist[len1 - 1][len2 - 1];    }}



原创粉丝点击