這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
先貼問題:
- Delete Operation for Two Strings
Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in each step you can delete one character in either string.
說白了就是找到兩個字串非連續最大公用字串。如果對dp演算法很熟悉的很快就能想到這個問題的解法,然而我並不是很熟悉,所以用了一個很挫很慢的方法,個人理解應該是分治法,很多步驟被重複算了很多次。
寫的很搓,輕噴。
下面就要介紹一下簡單易懂的dp演算法啦,先上代碼(leetcode裡大神寫的,我只是用golang重寫一遍)
思路很簡單,比如 word1=abcd,word2=obdce。
用一個二維數組儲存計算的值(代碼裡多加了一行和一列置0方便計算)
比如比較word1的c和word2的c的時候,因為ab和obd的最大相同是1,所以這個位置上只需要dp[i-1][j-1]+1
動態規劃和分治區別:
動態規劃:它通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。動態規划算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃求解的問題,經分解得到子問題往往不是互相獨立的。
分治法:若用分治法來解這類問題,則分解得到的子問題數目太多,有些子問題被重複計算了很多次。如果我們能夠儲存已解決的子問題的答案,而在需要時再找出已求得的答案,這樣就可以避免大量的重複計算,節省時間。我們可以用一個表來記錄所有已解的子問題的答案。
註:不管該子問題以後是否被用到,只要它被計算過,就將其結果填入表中。這就是動態規劃法的基本思路。
這一題算是讓我對動態規劃有一個更深的印象,故記錄一下。以前雖然會寫,但是每次遇到問題都不會想不到去用,還是自己疏於練習。
紙上得來終覺淺,絕知此事要躬行呀。