Leetcode 72 Edit Distance DP好題
來源:程序員人生 發(fā)布時(shí)間:2016-10-12 09:43:54 閱讀次數(shù):2638次
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
求用插入、刪除、替換3種操作將字符串a(chǎn)變成字符串b的最小步數(shù)。
dp[i][j]表示a的前i個(gè)字符變成b的前j個(gè)字符需要的最少步數(shù)。
先初始化邊界情況 dp[i][0]和dp[0][i],
當(dāng)判斷的兩位相同時(shí),不需要做任何操作,所以
dp[i][j]=dp[i⑴][j⑴];
而當(dāng)兩位不同時(shí),需要找出3種操作中操作較小的1種。
從dp[i⑴][j]轉(zhuǎn)移過來是用了刪除,相當(dāng)于i這位沒有了;
從dp[i][j⑴]轉(zhuǎn)移過來是用了插入,相當(dāng)于j這位是新添加的;
從dp[i⑴][j⑴]轉(zhuǎn)移過來是用了替換;
所以合并起來是這樣的:
dp[i][j]=min(min(dp[i⑴][j],dp[i][j⑴]),dp[i⑴][j⑴])+1;
class Solution {
public:
int minDistance(string word1, string word2) {
vector<int> temp(word2.size()+1,0);
vector<vector<int>> dp(word1.size()+1,temp);
for(int i=0;i<=word1.size();i++) dp[i][0]=i;
for(int i=0;i<=word2.size();i++) dp[0][i]=i;
for(int i=1;i<=word1.size();i++)
{
for(int j=1;j<=word2.size();j++)
{
if(word1[i⑴]==word2[j⑴])
dp[i][j]=dp[i⑴][j⑴];
else
{
dp[i][j]=min(min(dp[i⑴][j],dp[i][j⑴]),dp[i⑴][j⑴])+1;
}
}
}
return dp[word1.size()][word2.size()];
}
};
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)