leetcode 712

這題是個好題目,mark一下。首先我的思路是求這兩個字符串的最長公共子序列,然後遍歷這些子序列,找到值最小的那個。結果想了一下,最長子序列不唯一,這樣回溯特別複雜,這題應該不是這樣做(今天太忙,明天要把最長子序列的長度及回溯實現一下)。後來看了答案才知道是用動態規劃來做。說實話,動態規劃現在對於我而言,還是不太能掌握的東西,因爲很多時候想不到如何很好地定義dp數組的含義,還需要多加聯繫。

dp最關鍵的兩個步驟,dp數組含義的定義以及子問題的聯繫。這裏dp[i][j]的含義是s1[i:]與s2[j:]它們的最小代價值。既然用到dp,像遞歸一樣,我們也需要定義特殊情況,特殊情況就是i=len(s1)或者j=len(s2)。這時候dp[i][j]的值就相當於沒有到頭的字符串的ascii碼累加。定義好了特殊情況,那我們從底向上或者從上到底來把dp弄完。這時候就需要關係式。可以發現如果s1[i]=s2[j],那麼dp[i][j]=dp[i+1][j+1],因爲加的值是相同的,對於結果沒有影響。如果它們不同,dp[i][j] = min(dp[i+1][j]+ord(s1[i]),dp[i][j+1]+ord(s2[j])),和求最長公共子序列類似,值肯定就是這樣的形式,這題我覺得比較經典,mark,mark.

hint:  ord函數 能夠將字符轉換成ASCII碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章