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公式吧先对每行每列初始化(有点坑的)
然后是dp公式:
dp[i][j] : str1[0,i] transform to str2[0,j]
dp[i][j] maybe from
1.dp[i-1][j-1] op:replace
2.dp[i-1][j] op:delete
3.dp[i][j-1] op:insert
判断哪个小就用那个呗
int minDistance(string word1, string word2) {
int l1 = word1.length(),l2 = word2.length();
if(l1 == 0) return l2;
if(l2 == 0) return l1;
vector<int> tmp(l2,0);
vector<vector<int>> dp(l1,tmp);
dp[0][0] = word1[0] == word2[0]?0:1;
int flag = dp[0][0] ==0?0:1;
int val;
for (int i = 1;i<l1; i++) {
val = word1[i] == word2[0];
dp[i][0] = dp[i-1][0] + ((val&flag)==1?0:1);
if (val&flag) {
flag = 0;
}
}
flag = dp[0][0] ==0?0:1;
for (int j= 1; j<l2; j++) {
val = word1[0] == word2[j];
dp[0][j] = dp[0][j-1] + ((val&flag)==1?0:1);
if (val&flag) {
flag = 0;
}
}
int t1=0;
int t2=0;
int t3=0;
for (int i =1; i<l1; i++) {
for (int j =1; j<l2; j++) {
val = (word1[i]==word2[j]);
t1 = dp[i-1][j-1] + (val == 0);
t2 = dp[i-1][j] +1;
t3 = dp[i][j-1] +1;
dp[i][j] = min(t1,min(t2,t3));
}
}
return dp[l1-1][l2-1];
}
WARNNING:JI DE PING LUN NA~~~~~~~~~