最小编辑距离

问题

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


思路

网上有的版本说的是要在word2上面做操作,不敢苟同

言归正传,本题采用动态规划的算法,用d[ i ][ j ],表示word1中前i个字符和word2中前j个字符的编辑距离;

情况就可以分成以下几种,d[ i ][ j ] 是以下几种情况的最小值:

情况1 、

d[ i-1 ][ j ] ,我们已经求得了word1的前 i - 1 个字符到 word 2 的前 j个字符花费的步长,那么,要得到 word1 的前 i  个字符到 j 个字符的步长,只需要将word1 中减去一个字符就然后加上  d[ i-1 ][ j ]  就可以了,也就是d[ i ][ j ] = d[ i-1 ][ j ] + cost( delete word1.delete(word1[i]) ) 

情况2 、

d[ i1 ][ j-1 ]我们已经求得了word1的前 i 个字符到 word2 的前 j - 1 个字符花费的步长,那么,要得到 word1 的前 i  个字符到 j 个字符的步长,只需要将word1 中减去一个字符就然后加上  d[ i-1 ][ j ]  就可以了, 也就是d[ i ][ j ] = d[ i ][ j - 1 ] + cost(  word1.insert( word2[ j ] ) ) 

情况3 、

d[ i-1][ j-1 ]  我们已经求得了word1的前i-1个字符到word2的前j-1个字符花费的步长,那么 如果word1[ i ] == word2[ j ] ,则d[ i ][ j ] =d[ i-1][ j-1 ]  , 否则 将word1[ i ] 替换成为 word2[ j ]即可。 也就是d[ i ][ j ] = d[ i - 1 ][ j  - 1 ] + A  , 当word1[ i ] == word2[ j ] , A=0 ,否则 A = cost(word1.changer(word1[ i ] to word2[ j ])

代码大概长成这个样子

class Solution {
public:
	int min(int i , int j , int k){
		int rt = i < j ? i : j;
		rt = rt < k ? rt : k;
		return rt;
	}
    int minDistance(string word1, string word2) {
		int len1 = word1.length() + 1;
		int len2 = word2.length() + 1;
		const int INSERT_COST = 1;
		const int DELETE_COST = 1;
		const int CHANGE_COST = 1;
		vector< vector <int > > d;
		for(int i = 0  ; i < len1 ; i++){
			vector<int> vec(len2 , 0);
			d.push_back(vec);
		}
		for(int i = 0 ; i < len2 ; i++){
			d[0][i] = i*INSERT_COST;
		}
		for(int i = 0 ; i < len1 ; i++){
			d[i][0] = i*DELETE_COST;
		}
		
		for(int i = 1 ; i < len1 ; i++){
			for(int j = 1 ; j < len2  ; j++){
				int change_cost = word1.at(i-1) == word2.at(j-1) ? d[i-1][j-1] : d[i-1][j-1] + CHANGE_COST;
				d[i][j] = min( d[i-1][j] + DELETE_COST, d[i][j-1] + INSERT_COST , change_cost);	
			}
		}
		return d[len1-1][len2-1];
    }
};

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值