1. 程式人生 > 其它 >不同的子序列 - 動態規劃

不同的子序列 - 動態規劃

給定一個字串 s 和一個字串 t ,計算在 s 的子序列中 t 出現的個數。

字串的一個 子序列 是指,通過刪除一些(也可以不刪除)字元且不干擾剩餘字元相對位置所組成的新字串。(例如,"ACE" 是 "ABCDE" 的一個子序列,而 "AEC" 不是)

題目資料保證答案符合 32 位帶符號整數範圍。

思路:可以和最長的迴文子串有點類似,dp[i][j] 定義為t的前i個字元在s的前j個字元最多有多少個子串,當t為空的時候,初始化dp[0][j]為1,當t的i和s的j相同的時候,需要將i- 1 和j - 1還有i和j - 1的想加起來,因為相等的時候,可以兩個都往前移動,也可以將t不變,s往前移動。當不相同的時候,需要i和j都需要減一。

具體實現程式碼如下:

package com.lhb.offer;

/**
 * @author lhb
 * @date 2022/3/15
 */
public class Offer_115 {
    static int help(String s, String t) {
        int len1 = s.length();
        int len2 = t.length();
        int[][] dp = new int[len2 + 1][len1 + 1];
        for (int i = 0; i <= len1; i++) {
            dp[
0][i] = 1; } for (int i = 1; i <= len2; i++) { for (int j = 1; j <= len1; j++) { if (t.charAt(i - 1) == s.charAt(j - 1)) { dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1]; } else { dp[i][j] = dp[i][j - 1]; } } }
return dp[len2][len1]; } public static void main(String[] args) { String s = "absjhskgsjkhhhhh"; String t = "absh"; int ret = help(s, t); System.out.println(ret);// 16 } }