摘要:題目要求輸入兩個(gè)字符串和,允許對(duì)進(jìn)行插入,刪除和替換的操作,計(jì)算出將轉(zhuǎn)化為所需要的最少的操作數(shù)。其中存儲(chǔ)的是轉(zhuǎn)換為的最小步數(shù)。首先從邊緣情況開(kāi)始考慮。只要在此基礎(chǔ)上再進(jìn)行一次插入操作即可以完成轉(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
輸入兩個(gè)字符串word1和word2,允許對(duì)word1進(jìn)行插入,刪除和替換的操作,計(jì)算出將word1轉(zhuǎn)化為word2所需要的最少的操作數(shù)。
思路這是一道典型的dynamic programming的題目,這里我們利用二維數(shù)組steps來(lái)存儲(chǔ)相應(yīng)的情況。其中steps[i][j]存儲(chǔ)的是word1[0..i-1]轉(zhuǎn)換為word2[0..j-1]的最小步數(shù)。那么如何計(jì)算stepsi呢。
首先從邊緣情況開(kāi)始考慮。
如果i=0,也就是word1=“”,那么將word1轉(zhuǎn)化為word2的最少操作數(shù)為j
同理,如果j=0,也就是word2=“”,那么將word2轉(zhuǎn)化為word1的最少操作數(shù)為i
這時(shí)我們?cè)倏紤]i,j都不為0的情況。
可能出現(xiàn)以下幾種情況:
1.word1[i-1]==word2[j-1]
如果下標(biāo)相等,那么steps[i][j]=steps[i-1][j-1]。從語(yǔ)義的角度上來(lái)說(shuō),假設(shè)已知將word1[0...i-2]轉(zhuǎn)化為word2[0...j-2]的最小操作數(shù),那么如果彼此下一個(gè)值相等,則無(wú)需進(jìn)行操作。
2.word1[i-1]!=word2[j-1]
插入:在word1[i-1]的位置上插入word2[j-1],也就是說(shuō)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]等價(jià)于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ǔ)上再進(jìn)行一次插入操作即可以完成轉(zhuǎn)換。所以steps[i][j]=steps[i][j-1]+1
刪除操作同理,word[0...i-2]可以轉(zhuǎn)化為word[0...j-1],只需要再此基礎(chǔ)上再進(jìn)行一次刪除操作即可,所以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()]; }
想要了解更多開(kāi)發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67550.html
摘要:復(fù)雜度思路考慮用二維來(lái)表示變換的情況。如果兩個(gè)字符串中的字符相等,那么如果兩個(gè)字符串中的字符不相等,那么考慮不同的情況表示的是,從字符串到的位置轉(zhuǎn)換到字符串到的位置,所需要的最少步數(shù)。 LeetCode[72] Edit Distance Given two words word1 and word2, find the minimum number of steps require...
摘要:給出兩個(gè)解,一個(gè)是填表,一個(gè)是記憶化搜索。因?yàn)樘畋硪欢〞?huì)把的表填滿(mǎn)。走出來(lái)的則是一條從起點(diǎn)到終點(diǎn)的線(xiàn),不會(huì)填滿(mǎn)整個(gè)表。時(shí)間退化到,變成找路徑的時(shí)間。 72 Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. ...
摘要:比較長(zhǎng)度法復(fù)雜度時(shí)間空間思路雖然我們可以用的解法,看是否為,但中會(huì)超時(shí)。這里我們可以利用只有一個(gè)不同的特點(diǎn)在時(shí)間內(nèi)完成。 One Edit Distance Given two strings S and T, determine if they are both one edit distance apart. 比較長(zhǎng)度法 復(fù)雜度 時(shí)間 O(N) 空間 O(1) 思路 雖然我們可以用...
摘要:復(fù)雜度思路考慮如果兩個(gè)字符串的長(zhǎng)度,是肯定當(dāng)兩個(gè)字符串中有不同的字符出現(xiàn)的時(shí)候,說(shuō)明之后的字符串一定要相等。的長(zhǎng)度比較大的時(shí)候,說(shuō)明的時(shí)候,才能保證距離為。 LeetCode[161] One Edit Distance Given two strings S and T, determine if they are both one edit distance apart. Stri...
摘要:動(dòng)態(tài)規(guī)劃復(fù)雜度時(shí)間空間思路這是算法導(dǎo)論中經(jīng)典的一道動(dò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...
閱讀 2082·2021-11-02 14:48
閱讀 2760·2019-08-30 14:19
閱讀 2929·2019-08-30 13:19
閱讀 1297·2019-08-29 16:17
閱讀 3230·2019-08-26 14:05
閱讀 2987·2019-08-26 13:58
閱讀 3075·2019-08-23 18:10
閱讀 1105·2019-08-23 18:04