不同的子序列 - 動態規劃
阿新 • • 發佈:2022-03-15
給定一個字串 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 } }