給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 。
你可以對乙個單詞進行如下三種操作:
插入乙個字元
刪除乙個字元
替換乙個字元
示例 1:
輸入: word1 = 「horse」, word2 = 「ros」
輸出: 3
解釋:
horse -> rorse (將 『h』 替換為 『r』)
rorse -> rose (刪除 『r』)
rose -> ros (刪除 『e』)
需要借助二維陣列來記錄 字串的(子串的最小運算元)
最開始的想法是把word1給剪下成 類似於word2的形態,但也僅僅是想想,實際上是很蠢的辦法!!!因為當word2中有相同的字元的時候 你不知道 word1裡面的那個字元對應於word2的哪乙個?(依次試一試?代價太大!)
關鍵是下面的想法,拿上面的word1=「horse」 word2=「ros」 舉例說明:
1.在你思考的過程中需要想一想, 如果 word2=「ro」 的話 我也應該可以求出 最小運算元 是r 也一定!!可以
2.我能不能 用求子串的 最小運算元 來求 比它稍微大一點的串 的運算元?
3.如果能的話,有怎樣的關係(能的話,我肯定要用一種資料結構去記錄子串的 最小運算元 來計算後面的運算元 ,那麼我們用那種資料結構 乙個int變數?一維陣列?二維陣列?)
4.如果我用一種資料結構去記錄子串運算元(記錄那個子串?或者是哪些子串?)比如:
(1)理論上 我們可以 dp【i】 (i ,from 0 to word1.size()-1)去記錄
word1的(0—i)變成word 2 需要的最小運算元
(2)或者 dp【j】(j,from 0 to word2.size()-1) 去記錄 word1 (整體的串)變成 word2【j】(0—j)需要的最小運算元
(3)再或者 dp【i】【j】{i表示word1的(0—-i) j表示word2的(0——j)}從word1 子串 到 word2子串的 最小運算元
哪種可以推倒出大範圍的子串 需要自己仔細思考!!!這裡給出以(3)的**
注意 m【i】【j】的初始化 以及 m【i】【j】是如何從 之前的資料算得的!!!
(ps:min()函式沒有寫進來)
void chushihua(vector
>&m, string &word1, string &word2)
if (i >= word1.size())
else
for (; j <= word2.size() - 1; j++)
if (j >= word2.size())
else
}int mindistance(string word1, string word2)
if (word1.size() == 0) return word2.size();
vector
>m(word1.size());
for (int i = 0; i <= m.size() - 1; i++) m[i].resize(word2.size());
chushihua(m, word1, word2);
for (int i = 1; i <= m.size() - 1; i++)}}
return m[word1.size() - 1][word2.size() - 1];
}
動態規劃之LeetCode第72題 編輯距離
首先先學習乙個經典的演算法吧,就是和本題一模一樣的 編輯距離演算法 編輯距離,minimum edit distance,簡稱med,是俄羅斯科學家 vladimir levenshtein 在1965年提出,也因此而得名 levenshtein distance。用來度量兩個序列相似程度的指標。通...
leetcode題集 72 編輯距離
題目大意 給定兩個字串,求解將 word1 轉化成 word2 的最小操作。操作有三個,替換,增加和刪除。題目分析 突然給定乙個這樣的題目,求解有效可能集合中的最優解。第一想法當然就想到了動態規劃,可是怎麼找狀態轉移方程呢?又應該選擇哪個狀態呢?一般能想到兩個,乙個是dp i j 表示長度為 i 的...
Leetcode 72 編輯距離
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r ...