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()];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章