タイトル説明:
2 つの単語 word1
sum が与えられた場合word2
、 合計をword1
同じ にするために必要な最小ステップ数を返します。word2
各ステップでは、 任意の文字列から 1 文字を削除できます。
分析:
動的計画法の 5 つのステップを覚えておいてください。
1. dp 配列の意味を決定する
2.再帰式を決定する
3. dp 配列の初期化
4. 走査順序を決定する
01 バックパック問題: 1 次元 dp の走査、製品は外側のループに配置され、バックパックは内側のループに配置され、内側のループは逆の順序で配置されます。
組み合わせを求める:最初に製品を横切り、次にバックパックを横切ります
手配を求める:最初にバックパックを容易にし、次に製品を横断します
最大値と最小値を見つける: 走査順序の要件はありません
5.列挙と導出
コード:
class Solution {
public int minDistance(String word1, String word2) {
int len1=word1.length();
int len2=word2.length();
//dp[i][j]:使得s[i-1]和s[j-1]相同的最小步数
int[][] dp=new int[len1+1][len2+1];
for(int i=0;i<=len1;i++) dp[i][0]=i;
for(int j=0;j<=len2;j++) dp[0][j]=j;
for(int i=1;i<=len1;i++){
char c1=word1.charAt(i-1);
for(int j=1;j<=len2;j++){
char c2=word2.charAt(j-1);
if(c1==c2){
dp[i][j]=dp[i-1][j-1];
}else{
/*如果最后一个字符不同,可以有三种操作:
1.把两个字符都删掉。操作次数+2
2.把word1的字符删掉或把word2的字符删掉,操作次数+1
*/
dp[i][j]=Math.min(dp[i-1][j-1]+2,Math.min(dp[i-1][j]+1,dp[i][j-1]+1));
}
}
}
return dp[len1][len2];
}
}
問題を解決するための動的計画法:
運動規則問題をやっていると、状態遷移式を覚えて、ひょうたん図に合わせて変更してからコードを書き始めるという誤解に陥る生徒が多いのではないでしょうか。これは一種のぼんやりした状態で、問題に合格して、もう少し難しい問題に出くわしたら、すぐにはできないかもしれません。そして、問題の解決策を見て、次に進みます。ひょうたんに従ってこの悪循環に陥ります。再帰式を決定することは、動的計画法の問題を解決するための 1 つのステップにすぎません。再帰式は知っているが、dp 配列を初期化する方法と、配列を正しくトラバースする方法がわからない
したがって、動的計画法の 5 つのステップを常に念頭に置いています。
1. dp 配列の意味を決定する
2.再帰式を決定する
3. dp 配列の初期化
4. 走査順序を決定する
5. 導出例
質問をする前に、次の 3 つの質問について考えてみてください。
- この質問の状態遷移式を導出する例を挙げましたか?
- dp配列を導出する例を挙げましたか?
- 印刷された dp 配列は、私が思っていたものと同じですか?
フォローアップ シーケンスで問題を解決するためにブロガーをフォローすると、誰もがこの 5 つのステップの重要性を徐々に感じるようになります。
ブロガーは、LeetCodeの問題解決とJava学習プロセスの質問を更新し続けます(すべて質問の種類ごとに分類されています〜).