天天看點

leetcode 115. 不同的子序列

給定一個字元串 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為例子。

可以得到二維數組如下,最後求和即為答案。

leetcode 115. 不同的子序列

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;
    }      
上一篇: 每日學習
下一篇: PHP HTTP 函數