[leetcode]Distinct Subsequences

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

算法思路:

思路1:递归,求出所有长度为t.length()的子串,相比会超时

思路2:DP;dp[i][j]代表从s[0..i]中删除s.length - t.length个字符得到t[0..j]的不同删除方法数。

  • 初始化:如果t为空,任意的s删除到t都是1种。
  • 如果S[i] = T[j], dp[i][j] = dp[i-1][j-1]+dp[i][j - 1]
  • 如果S[i] 不等于 T[j], dp[i][j] = dp[i][j - 1]

代码如下:

 1 public class Solution {
 2     public int numDistinct(String s, String t) {
 3         if(s == null || t == null || s.length() < t.length()) return 0;
 4         int[][] dp = new int[t.length() + 1][s.length() + 1];
 5         for(int i = 0; i < s.length() + 1; i++){
 6             dp[0][i] = 1;
 7         }
 8         for(int i = 1; i < t.length() + 1;i++){
 9             char c = t.charAt(i - 1);
10             for(int j = 1; j < s.length() + 1; j++){
11                 if(s.charAt(j - 1) == c){
12                     dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1];
13                 }else{
14                     dp[i][j] = dp[i][j - 1];
15                 }
16             }
17         }
18         return dp[t.length()][s.length()];
19     }
20 }
原文地址:https://www.cnblogs.com/huntfor/p/3886175.html