LeetCode 72. Edit Distance 115. Distinct Subsequences 字符串 DP

72. Edit Distance

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character

題目鏈接

題目描述
給定字符串word1和word2,求從word1通過insert,delete,replace三種操作達到word2的最少操作。
思路
典型的動態規劃題目,三種狀態轉移方程,dp[i][j]代表着從word1的前i個字符轉換到word2前j個字符的最少操作。


public class EditDistance {
    public int minDistance(String word1, String word2) {
        int[][] dp = new int[word1.length()+1][word2.length()+1]; 
        for ( int i=0; i<=word1.length(); i++ ) 
            dp[i][0] = i; 
        for ( int i=0; i<=word2.length(); i++ ) 
            dp[0][i] = i; 
        for ( int i=1; i<=word1.length(); i++ ) {
            for ( int j=1; j<=word2.length(); j++ ) {
                int insert = dp[i][j-1] + 1;  
                int delete = dp[i-1][j] + 1; 
                int replace = dp[i-1][j-1] + (word1.charAt(i-1)==word2.charAt(j-1)?0:1); 
                dp[i][j] = Math.min(delete, Math.min(insert, replace));
            }
        }
        return dp[word1.length()][word2.length()];
    }
}

115. Distinct Subsequences

Given a string S and a string T, count the number of distinct subsequences of S which equals T.

A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, “ACE” is a subsequence of “ABCDE” while “AEC” is not).

Here is an example:
S = “rabbbit”, T = “rabbit”

Return 3.

題目鏈接
題目描述
給定字符串S和T,求S通過刪除操作,一共有多少種辦法變成T;
dp[i][j]代表着從S的前i個字符轉換到T前j個字符的方法數目。在遍歷的時候
如果S[i-1]==T[j-1] 那麼S[i-1]可保留,也可刪除。
如果S[i-1] !=T[j-1] 那麼S[i-1]只能刪除。


public class DistinctSubsequence {
    public int numDistinct(String S, String T) {
        int[][] dp = new int[S.length()+1][T.length()+1]; 
        for ( int i=0; i<=S.length(); i++ ) {
            dp[i][0] = 1 ; 
        }
        for ( int j=1; j<T.length()+1; j++ ) {
            for ( int i=j; i<S.length()+1; i++ ) {
                if ( S.charAt(i-1)==T.charAt(j-1) ) {  //下標錯誤!
                    dp[i][j] = dp[i-1][j-1] + dp[i-1][j]; 
                } else {
                    dp[i][j] = dp[i-1][j]; 
                }
            }
        }
        return dp[S.length()][T.length()];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章