最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)LeetCode(72.編輯距離)

 更新時間:2021年07月17日 10:08:25   作者:Grandyang  
這篇文章主要介紹了C++實現(xiàn)LeetCode(72.編輯距離),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 72. Edit Distance 編輯距離

Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2.

You have the following 3 operations permitted on a word:

  1. Insert a character
  2. Delete a character
  3. Replace a character

Example 1:

Input: word1 = "horse", word2 = "ros"
Output: 3
Explanation:
horse -> rorse (replace 'h' with 'r')
rorse -> rose (remove 'r')
rose -> ros (remove 'e')

Example 2:

Input: word1 = "intention", word2 = "execution"
Output: 5
Explanation:
intention -> inention (remove 't')
inention -> enention (replace 'i' with 'e')
enention -> exention (replace 'n' with 'x')
exention -> exection (replace 'n' with 'c')
exection -> execution (insert 'u')

這道題讓求從一個字符串轉(zhuǎn)變到另一個字符串需要的變換步驟,共有三種變換方式,插入一個字符,刪除一個字符,和替換一個字符。題目乍眼一看并不難,但是實際上卻暗藏玄機(jī),對于兩個字符串的比較,一般都會考慮一下用 HashMap 統(tǒng)計字符出現(xiàn)的頻率,但是在這道題卻不可以這么做,因為字符串的順序很重要。還有一種比較常見的錯誤,就是想當(dāng)然的認(rèn)為對于長度不同的兩個字符串,長度的差值都是要用插入操作,然后再對應(yīng)每位字符,不同的地方用修改操作,但是其實這樣可能會多用操作,因為刪除操作有時同時可以達(dá)到修改的效果。比如題目中的例子1,當(dāng)把 horse 變?yōu)?rorse 之后,之后只要刪除第二個r,跟最后一個e,就可以變?yōu)?ros。實際上只要三步就完成了,因為刪除了某個字母后,原來左右不相連的字母現(xiàn)在就連一起了,有可能剛好組成了需要的字符串。所以在比較的時候,要嘗試三種操作,因為誰也不知道當(dāng)前的操作會對后面產(chǎn)生什么樣的影響。對于當(dāng)前比較的兩個字符 word1[i] 和 word2[j],若二者相同,一切好說,直接跳到下一個位置。若不相同,有三種處理方法,首先是直接插入一個 word2[j],那么 word2[j] 位置的字符就跳過了,接著比較 word1[i] 和 word2[j+1] 即可。第二個種方法是刪除,即將 word1[i] 字符直接刪掉,接著比較 word1[i+1] 和 word2[j] 即可。第三種則是將 word1[i] 修改為 word2[j],接著比較 word1[i+1] 和 word[j+1] 即可。分析到這里,就可以直接寫出遞歸的代碼,但是很可惜會 Time Limited Exceed,所以必須要優(yōu)化時間復(fù)雜度,需要去掉大量的重復(fù)計算,這里使用記憶數(shù)組 memo 來保存計算過的狀態(tài),從而可以通過 OJ,注意這里的 insertCnt,deleteCnt,replaceCnt 僅僅是表示當(dāng)前對應(yīng)的位置分別采用了插入,刪除,和替換操作,整體返回的最小距離,后面位置的還是會調(diào)用遞歸返回最小的,參見代碼如下:

解法一:

class Solution {
public:
    int minDistance(string word1, string word2) {
        int m = word1.size(), n = word2.size();
        vector<vector<int>> memo(m, vector<int>(n));
        return helper(word1, 0, word2, 0, memo);
    }
    int helper(string& word1, int i, string& word2, int j, vector<vector<int>>& memo) {
        if (i == word1.size()) return (int)word2.size() - j;
        if (j == word2.size()) return (int)word1.size() - i;
        if (memo[i][j] > 0) return memo[i][j];
        int res = 0;
        if (word1[i] == word2[j]) {
            return helper(word1, i + 1, word2, j + 1, memo);
        } else {
            int insertCnt = helper(word1, i, word2, j + 1, memo);
            int deleteCnt = helper(word1, i + 1, word2, j, memo);
            int replaceCnt = helper(word1, i + 1, word2, j + 1, memo);
            res = min(insertCnt, min(deleteCnt, replaceCnt)) + 1;
        }
        return memo[i][j] = res;
    }
};

根據(jù)以往的經(jīng)驗,對于字符串相關(guān)的題目且求極值的問題,十有八九都是用動態(tài)規(guī)劃 Dynamic Programming 來解,這道題也不例外。其實解法一的遞歸加記憶數(shù)組的方法也可以看作是 DP 的遞歸寫法。這里需要維護(hù)一個二維的數(shù)組 dp,其大小為 mxn,m和n分別為 word1 和 word2 的長度。dp[i][j] 表示從 word1 的前i個字符轉(zhuǎn)換到 word2 的前j個字符所需要的步驟。先給這個二維數(shù)組 dp 的第一行第一列賦值,這個很簡單,因為第一行和第一列對應(yīng)的總有一個字符串是空串,于是轉(zhuǎn)換步驟完全是另一個字符串的長度。跟以往的 DP 題目類似,難點還是在于找出狀態(tài)轉(zhuǎn)移方程,可以舉個例子來看,比如 word1 是 "bbc",word2 是 "abcd",可以得到 dp 數(shù)組如下:

  Ø a b c d
Ø
0 1 2 3 4
b
1 1 1 2 3
b
2 2 1 2 3
c
3 3 2 1 2

通過觀察可以發(fā)現(xiàn),當(dāng) word1[i] == word2[j] 時,dp[i][j] = dp[i - 1][j - 1],其他情況時,dp[i][j] 是其左,左上,上的三個值中的最小值加1,其實這里的左,上,和左上,分別對應(yīng)的增加,刪除,修改操作,具體可以參見解法一種的講解部分,那么可以得到狀態(tài)轉(zhuǎn)移方程為:

dp[i][j] =      /    dp[i - 1][j - 1]                                                                   if word1[i - 1] == word2[j - 1]

                  \    min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1            else

解法二:

class Solution {
public:
    int minDistance(string word1, string word2) {
        int m = word1.size(), n = word2.size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1));
        for (int i = 0; i <= m; ++i) dp[i][0] = i;
        for (int i = 0; i <= n; ++i) dp[0][i] = i;
        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (word1[i - 1] == word2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
                }
            }
        }
        return dp[m][n];
    }
};

到此這篇關(guān)于C++實現(xiàn)LeetCode(72.編輯距離)的文章就介紹到這了,更多相關(guān)C++實現(xiàn)編輯距離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn) 單例模式實例詳解

    C++實現(xiàn) 單例模式實例詳解

    這篇文章主要介紹了C++實現(xiàn) 單例模式實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Visual?Studio2022下Opencv的配置圖文教程

    Visual?Studio2022下Opencv的配置圖文教程

    本文主要介紹了Visual?Studio2022下Opencv的配置圖文教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C++實現(xiàn)雙向鏈表代碼分析

    C++實現(xiàn)雙向鏈表代碼分析

    這篇文章主要介紹了C++實現(xiàn)雙向鏈表代碼分析,前面文章分析了單向鏈表,這篇文章就來給大家分享雙鏈表的實現(xiàn)吧,需要的朋友可以參考一下
    2022-03-03
  • C++編程中的命名空間基本知識講解

    C++編程中的命名空間基本知識講解

    這篇文章主要介紹了C++編程中的命名空間基本知識講解,包括對C++11中內(nèi)聯(lián)命名空間新特性的介紹,需要的朋友可以參考下
    2016-01-01
  • 淺談哈希表存儲效率一般不超過50%的原因

    淺談哈希表存儲效率一般不超過50%的原因

    下面小編就為大家?guī)硪黄獪\談哈希表存儲效率一般不超過50%的原因。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++ STL中的常用遍歷算法分享

    C++ STL中的常用遍歷算法分享

    這篇文章主要為大家詳細(xì)介紹了C++ STL中兩個常用的遍歷算法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)與借鑒價值,感興趣的小伙伴可以參考一下
    2022-12-12
  • C++中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法

    C++中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法

    這篇文章主要介紹了C++中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • GCC編譯過程(預(yù)處理,編譯,匯編,鏈接)及GCC命令詳解

    GCC編譯過程(預(yù)處理,編譯,匯編,鏈接)及GCC命令詳解

    文章詳細(xì)介紹了GCC編譯器的工作原理,包括預(yù)處理、編譯、匯編和鏈接四個主要階段,每個階段都有其特定的任務(wù)和輸出文件,文章還解釋了如何使用GCC命令選項來查看每個階段的輸出,以及如何通過調(diào)整編譯選項來優(yōu)化程序性能或調(diào)試問題,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • c/c++小游戲源代碼

    c/c++小游戲源代碼

    這篇文章主要介紹了c/c++小游戲源代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • C語言線性表順序存儲結(jié)構(gòu)實例詳解

    C語言線性表順序存儲結(jié)構(gòu)實例詳解

    這篇文章主要介紹了C語言線性表順序存儲結(jié)構(gòu)實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評論

广东省| 当涂县| 沙河市| 竹溪县| 富民县| 扬州市| 吴堡县| 勃利县| 曲阳县| 福安市| 阿坝| 化州市| 镇坪县| 伊川县| 丹棱县| 常宁市| 富阳市| 泸溪县| 申扎县| 长治县| 鞍山市| 遂川县| 桦南县| 鄂托克旗| 资中县| 龙川县| 南和县| 元朗区| 石渠县| 句容市| 读书| 全州县| 巫溪县| 天门市| 安塞县| 阳信县| 高雄县| 郎溪县| 蒙山县| 佛学| 项城市|