給定一個字元串 s 和一個字元串 t ,計算在 s 的子序列中 t 出現的個數。
字元串的一個 子序列 是指,通過删除一些(也可以不删除)字元且不幹擾剩餘字元相對位置所組成的新字元串。(例如,"ACE" 是 "ABCDE" 的一個子序列,而 "AEC" 不是)
題目資料保證答案符合 32 位帶符号整數範圍。
示例 1:
輸入:s = "rabbbit", t = "rabbit"
輸出:3
解釋:
如下圖所示, 有 3 種可以從 s 中得到 "rabbit" 的方案。
rabbbit
示例 2:
輸入:s = "babgbag", t = "bag"
輸出:5
如下圖所示, 有 5 種可以從 s 中得到 "bag" 的方案。
babgbag
提示:
0 <= s.length, t.length <= 1000
s 和 t 由英文字母組成
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/distinct-subsequences
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
采用動态規劃,建立二維數組arr[i][j] 分别表示從後往前數,以s中倒數第i個開頭的字元串 中包含多少個在t中倒數第j個字元為開頭的字元串的子序列。
以babgbag 和 bag為例子。
可以得到二維數組如下,最後求和即為答案。

public int numDistinct(String s, String t) {
int a = s.length();
int b = t.length();
if (a == 0 || b == 0) {
return 0;
}
char[] as = s.toCharArray();
char[] bs = t.toCharArray();
int[][] arr = new int[b + 1][a];
int sum = 1;
for (int i = b - 1; i >= 0; i--) {
char c = bs[i];
int[] item = arr[i];
int[] last = arr[i + 1];
for (int j = a - 1; j >= 0; j--) {
if (c == as[j]) {
item[j] = sum;
}
sum += last[j];
}
sum = 0;
}
int[] item = arr[0];
for (int i : item) {
sum += i;
}
return sum;
}
public int numDistinct(String s, String t) {
int a = s.length();
int b = t.length();
if (a == 0 || b == 0) {
return 0;
}
char[] as = s.toCharArray();
char[] bs = t.toCharArray();
int[] arr = new int[a];
int sum = 1;
for (int i = b - 1; i >= 0; i--) {
char c = bs[i];
for (int j = a - 1; j >= 0; j--) {
int n = arr[j];
arr[j] = c == as[j] ? sum : 0;
sum += n;
}
sum = 0;
}
for (int i : arr) {
sum += i;
}
return sum;
}