先贴问题:
- 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
动态规划和分治区别:
动态规划:它通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。
分治法:若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。
注:不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。
这一题算是让我对动态规划有一个更深的印象,故记录一下。以前虽然会写,但是每次遇到问题都不会想不到去用,还是自己疏于练习。
纸上得来终觉浅,绝知此事要躬行呀。