Distinct Subsequences
Oct 19 '12
6266 / 17972
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.
我的很复杂的思路。。。。
package String; import java.util.HashMap; /** * @Title: Distinct_Subsequences.java * @Package String * @Description: TODO * @author nutc * @date 2013-9-1 下午3:16:51 * @version V1.0 */ public class Distinct_Subsequences { public static void main(String argsp[]){ Distinct_Subsequences l = new Distinct_Subsequences(); String s = "ddd"; String t = ""; System.out.println(l.numDistinct(s, t)); } public int numDistinct(String S, String T) { if (S == null && T == null) return 0; if (S == null) return 0; if (T == null) return 1; if (S.equals(T)) return 1; return compare(S, 0, T, 0); } HashMap<String, Integer> map = new HashMap<String, Integer>(); public int compare(String s, int i, String t, int j) { if (i == s.length()) return 0; if (j == t.length()) return 1;// if (j == t.length() - 1 && i == s.length() - 1) { if (s.charAt(i) == t.charAt(j)) return 1; else return 0; } int count = 0; if (s.charAt(i) == t.charAt(j)) { if (map.get((i + 1) + "-" + (j + 1)) != null) count += map.get((i + 1) + "-" + (j + 1)); else count += compare(s, i + 1, t, j + 1); } if (map.get((i + 1) + "-" + (j)) != null) count += map.get((i + 1) + "-" + (j)); else count += compare(s, i + 1, t, j); map.put(i + "-" + j, count); return count; } }
但是其实想清楚的话 是很简单的!
public class Solution { public int numDistinct(String S, String T) { int m = T.length(); int n = S.length(); int[][] dp = new int[m+1][n+1]; dp[0][0] = 1; for(int i=0;i<=m;i++) dp[i][0] = 0; //这两个初始值的区别 for(int j=0;j<=n;j++) dp[0][j] = 1; //这两个初始值的区别 for(int i=1;i<=m;i++) for(int j=1;j<=n;j++){ if (T.charAt(i-1)==S.charAt(j-1)) dp[i][j] = dp[i][j-1] + dp[i-1][j-1]; else dp[i][j] = dp[i][j-1]; } return dp[m][n]; } }