成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

leetcode72. Edit Distance

venmos / 1743人閱讀

摘要:題目要求輸入兩個字符串和,允許對進行插入,刪除和替換的操作,計算出將轉(zhuǎn)化為所需要的最少的操作數(shù)。其中存儲的是轉(zhuǎn)換為的最小步數(shù)。首先從邊緣情況開始考慮。只要在此基礎(chǔ)上再進行一次插入操作即可以完成轉(zhuǎn)換。

題目要求
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

輸入兩個字符串word1和word2,允許對word1進行插入,刪除和替換的操作,計算出將word1轉(zhuǎn)化為word2所需要的最少的操作數(shù)。

思路

這是一道典型的dynamic programming的題目,這里我們利用二維數(shù)組steps來存儲相應(yīng)的情況。其中steps[i][j]存儲的是word1[0..i-1]轉(zhuǎn)換為word2[0..j-1]的最小步數(shù)。那么如何計算stepsi呢。
首先從邊緣情況開始考慮。

如果i=0,也就是word1=“”,那么將word1轉(zhuǎn)化為word2的最少操作數(shù)為j
同理,如果j=0,也就是word2=“”,那么將word2轉(zhuǎn)化為word1的最少操作數(shù)為i

這時我們再考慮i,j都不為0的情況。
可能出現(xiàn)以下幾種情況:
1.word1[i-1]==word2[j-1]
如果下標(biāo)相等,那么steps[i][j]=steps[i-1][j-1]。從語義的角度上來說,假設(shè)已知將word1[0...i-2]轉(zhuǎn)化為word2[0...j-2]的最小操作數(shù),那么如果彼此下一個值相等,則無需進行操作。
2.word1[i-1]!=word2[j-1]

插入:在word1[i-1]的位置上插入word2[j-1],也就是說word1[0...i-1]=word2[0...j-1],steps[i][j]=steps[i][j-1]+1
替換:將word1[i-1]的值替換為word2[j-1]。steps[i][j]=steps[i-1][j-1]+1
刪除:將word1[i-1]的值刪除使word1[0...i-2]等價于word2[j-1], steps[i][j] = steps[i-1][j]+1
在這里解釋一下插入和刪除的算法的原理。
如果插入即可使word1[0...i-1]轉(zhuǎn)化為word2[0...j-1],那么意味著word[0...i-1]可以轉(zhuǎn)換為word2[0...j-2]。只要在此基礎(chǔ)上再進行一次插入操作即可以完成轉(zhuǎn)換。所以steps[i][j]=steps[i][j-1]+1
刪除操作同理,word[0...i-2]可以轉(zhuǎn)化為word[0...j-1],只需要再此基礎(chǔ)上再進行一次刪除操作即可,所以steps[i][j] = steps[i-1][j]+1
代碼
    public int minDistance(String word1, String word2) {
        if(word1.isEmpty()) return word2.length();
        if(word2.isEmpty()) return word1.length();
        int[][] steps = new int[word1.length()+1][word2.length()+1];
        for(int i = 0 ; i<=word1.length() ; i++){
            for(int j = 0 ; j<=word2.length() ; j++){
                if(i==0){
                    steps[i][j] = j;
                }else if(j==0){
                    steps[i][j] = i;
                }else if(word1.charAt(i-1) == word2.charAt(j-1)){
                    steps[i][j] = steps[i-1][j-1];
                 }else{
                     steps[i][j] = Math.min(Math.min(steps[i][j-1]+1, steps[i-1][j-1]+1), steps[i-1][j]+1);
                 }
                    
            }
        }
        return steps[word1.length()][word2.length()];
    }

優(yōu)化后的代碼如下:

    public int minDistance2(String word1, String word2){
        if(word1.isEmpty()) return word2.length();
        if(word2.isEmpty()) return word1.length();
        int[] steps = new int[word2.length()+1];
        for(int j = 0 ; j<=word2.length() ; j++){
            steps[j] = j;
        }
        for(int i = 1 ; i<=word1.length() ; i++){
            int pre = steps[0];
            steps[0] = i;
            for(int j = 1 ; j<=word2.length() ; j++){
                int temp = steps[j];
                if(word1.charAt(i-1)==word2.charAt(j-1)){
                    steps[j] = pre;
                }else{
                    steps[j] = Math.min(pre+1, Math.min(steps[j]+1, steps[j-1]+1));
                }
                pre = temp;
            }

        }
        return steps[word2.length()];
    }


想要了解更多開發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號!將會不定期的發(fā)放福利哦~

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67550.html

相關(guān)文章

  • LeetCode[72] Edit Distance

    摘要:復(fù)雜度思路考慮用二維來表示變換的情況。如果兩個字符串中的字符相等,那么如果兩個字符串中的字符不相等,那么考慮不同的情況表示的是,從字符串到的位置轉(zhuǎn)換到字符串到的位置,所需要的最少步數(shù)。 LeetCode[72] Edit Distance Given two words word1 and word2, find the minimum number of steps require...

    call_me_R 評論0 收藏0
  • 72 Edit Distance 以及兩個string比較的填表通解。

    摘要:給出兩個解,一個是填表,一個是記憶化搜索。因為填表一定會把的表填滿。走出來的則是一條從起點到終點的線,不會填滿整個表。時間退化到,變成找路徑的時間。 72 Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. ...

    ormsf 評論0 收藏0
  • [Leetcode] One Edit Distance 編輯距離為一

    摘要:比較長度法復(fù)雜度時間空間思路雖然我們可以用的解法,看是否為,但中會超時。這里我們可以利用只有一個不同的特點在時間內(nèi)完成。 One Edit Distance Given two strings S and T, determine if they are both one edit distance apart. 比較長度法 復(fù)雜度 時間 O(N) 空間 O(1) 思路 雖然我們可以用...

    lewinlee 評論0 收藏0
  • Leetcode[161] One Edit Distance

    摘要:復(fù)雜度思路考慮如果兩個字符串的長度,是肯定當(dāng)兩個字符串中有不同的字符出現(xiàn)的時候,說明之后的字符串一定要相等。的長度比較大的時候,說明的時候,才能保證距離為。 LeetCode[161] One Edit Distance Given two strings S and T, determine if they are both one edit distance apart. Stri...

    周國輝 評論0 收藏0
  • [Leetcode] Edit Distance 最小編輯距離

    摘要:動態(tài)規(guī)劃復(fù)雜度時間空間思路這是算法導(dǎo)論中經(jīng)典的一道動態(tài)規(guī)劃的題。 Edit Distance 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 h...

    zhangke3016 評論0 收藏0

發(fā)表評論

0條評論

venmos

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<