Saturday, January 10, 2015

LeetCode 115: Distinct Subsequences

Given a string S and a string T, count the number of distinct subsequences of T in S.
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.
public class Solution {
    public int numDistinct(String S, String T) {
        // DP problem
        // When you see string problem that is about subsequence or matching,
        // dynamic programming method should come to your mind naturally.
        // The key is to find the changing condition.
        
        // Let W(i, j) stand for the number of subsequences of S(0, i) in T(0, j).
        // If S.charAt(i-1) == T.charAt(j-1), W(i, j) = W(i-1, j-1) + W(i-1,j); Otherwise, W(i, j) = W(i-1,j).
	int[][] table = new int[S.length() + 1][T.length() + 1];
 
	for (int i = 0; i < S.length(); i++)
	    table[i][0] = 1;
 
    	for (int i = 1; i <= S.length(); i++)
    	    for (int j = 1; j <= T.length(); j++)
    	         if (S.charAt(i - 1) == T.charAt(j - 1))
    	            // e.g., S --- "abcaa" and T --- "bca"
    	            table[i][j] = table[i - 1][j] + table[i - 1][j - 1];
    	         else
    		    // If both last characters don't equal, S without last character doesn't change result.
    		    table[i][j] = table[i - 1][j];
     
    	return table[S.length()][T.length()];
    }
}

1 comment:

  1. I have a solution using less space:

    public class Solution {
    public int numDistinct(String s, String t) {
    if(s == null || t == null || t.length() == 0) return 0;
    int[] dp = new int[t.length()];

    for(int i = 0; i=0; j–){
    if(c == t.charAt(j)){
    dp[j] = dp[j] + (j!=0?dp[j-1]: 1);
    }
    }
    }
    return dp[t.length()-1];
    }
    }
    URL: http://traceformula.blogspot.com/2015/08/distinct-subsequences.html

    ReplyDelete