LeetCode第72題(編輯距離)

2021-08-27 21:31:23 字數 1748 閱讀 6998

給定兩個單詞 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 ...