演算法細節系列(14) 動態規劃之字串處理

2021-07-31 14:32:56 字數 2105 閱讀 4289

詳細**可以fork下github上leetcode專案,不定期更新。

題目均摘自leetcode:

水題,不一定要使用dp,但既然此章節關於dp,咱們就用dp解。

public

boolean

issubsequence(string s, string t)

}return isseq[n-1];

}

一道區間dp,更新沒什麼好說的,但需要注意兩個for迴圈的遍歷順序。遞推式:

//dp[j][i] 表示在區間[j,i]之間的最長回文,可斷

s[j] == s[i]: dp[j][i] = dp[j+1][i-1] + 2;

//沒有最新的回文生成,所以沿用舊的回文長度

s[j] != s[i]: dp[j][i] = math.max(dp[j+1][i],dp[j][i-1]);

public

intlongestpalindromesubseq(string s) else }}

return dp[0][n-1];

}

比較抽象的一道題,要求兩個字串的最短編輯距離。

dp[i][j] : 表示word1[0,i)和word2[0,j)的最短編輯距離

如:dp[1][0] = 1, "a"," "

dp[1][1] = ?, "a","a" 相等,? = 0,"a","b" 不相等, ? = 1

dp[i][0] = i;

dp[0][j] = j;

遞推式:

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

dp[i][j] = min(dp[i-1][j] + dp[i][j-1] + dp[i-1][j-1]) + 1; if word1[i] != word2[j];

舉個簡單的例子說明它們的含義:(word1不去操作,所有操作在word2上進行)

word1 : "a"

word2 : "ab"

dp[0][0] = 0; " " == " "

dp[0][1] = 1; edit -> "&a", "&b"

dp[0][2] = 2; edit -> "&&a", "&&"

dp[1][1] = dp[0][0] = 0; "a" == "a", no edit

dp[1][2] = ?; "a" != "b"

存在三種情況:

a. dp[1][2] = dp[0][1] = 2; "&a","&b" edit -> "&a","&a"

我們已知道了dp[0][1]表示為"&a","&b",所以只能進行替換操作。

即:dp[i][j] = dp[i-1][j-1]

dp[i-1][j-1]表示了最短編輯距離,也可以表示成兩字串經過編輯後已然相等,而此時為了能夠更新到dp[i][j],只能對word2的第j個字元做替換操作。

b. dp[1][2] = dp[1][1] = 1; "a","ab" edit -> "a","a"

即:dp[i][j] = dp[i][j-1]

顯然,dp[1][1] = 0,沒有操作。而此時為了能夠更新到dp[i][j],讓兩字串相等,只能刪除word2的第j個字元。

c. dp[1][2] = dp[0][2] = 3; "&&a","&&" edit -> "&&a","&&a"

即:dp[i][j] = dp[i-1][j];

同理,dp[0][2] = 2, 說明了word2 = "&&",而為了能夠更新到dp[i][j],只能新增到第j個字元後。

最後在這三種操作中,取最小的即可。

注意:」&」空字串佔位符,所以有」&&」 = 「&」,且我們所有操作只針對乙個物件。**如下:

public

intmindistance(string word1, string word2) }}

return cost[m][n];

}

演算法之動態規劃

一 思想 首先要了解 動態規劃 必須先知道什麼叫做 多階段決策 百科裡面對這個問題解釋的很全,我就load一段出來,大家得要好好品味,好好分析。上面圖中最後一句話就定義了動態規劃是要幹什麼的問題。二 使用規則 現在我們知道動態規劃要解決啥問題了,那麼什麼情況下我們該使用動態規劃呢?最優化原理 最優子...

演算法之動態規劃

鋼條切割問題 鋼條切割問題出現在 演算法導論 一書第204頁,作為動態規劃的例題出現,該題內容如下 serling公司購買長鋼條,將其切割為短鋼條 切割工序本身沒有成本支出。公司管理層希望知道最佳的切割方案。假定我們知道serling公司 一段長為i英吋的鋼條的 為pi i 1,2,單位為美元 鋼條...

演算法學習系列之 動態規劃法

早上起來,看了一道美團面試題,是關於動態規劃的。突然發現對學過的演算法並沒有乙個系統全面的認識。於是準備把經典演算法以寫部落格的形式回顧一遍。貴在堅持!如果問題是由交疊的子問題構成的,我們就可以運用動態規劃技術來解決它。一般來說,這樣的子問題出現在對給定問題求解的遞推關係中,這個遞推關係中包含了相同...