115. Distinct Subsequences
一、题目
1、审题
2、分析
给出字符串 s, 字符串 t;判断 s 中包含 t 的个数,其中 s 中的字符可以间隔包含,但不可以字符交叉包含 t 的字符。
二、解答
1、思路:
方法一、
采用 dp 进行实现。
①、新建二维数组, dp[t.length()+1][s.length+1],其中 dp[i+1][j+1] 表示 s 中前 j 个字符可以间隔匹配 t 的前 i 个字符的个数;
②、dp[0][j] = 1 (j != 0), 即 t 为空时,s 总能匹配一次。
③ dp[i][0] = 0; , 即 s 为空而 t 不为空时总无法匹配。
④、若 t.charAt(i) == s.charAt(j), 则 dp[i+1][j+1] = dp[i][j] + dp[i+1][j]; 即: s 前 j - 1 个字符匹配 t 前 i - 1 个字符的个数 + s 的前 j - 1 个字符匹配 t 的前 i 个字符的个数。
否则 dp[i+1][j+1] = dp[i+1][j];
public int numDistinct2(String s, String t) { // mem[i+1][j+1]: 表示 s 中第前 j 个字符可以匹配 t 的前 i 个字符的个数 int[][] mem = new int[t.length()+1][s.length()+1]; for(int j = 0; j <= s.length(); j++) mem[0][j]= 1; for (int i = 0; i < t.length(); i++) { // 行 for (int j = 0; j < s.length(); j++) { // 列 if(t.charAt(i) == s.charAt(j)) mem[i+1][j+1] = mem[i][j] + mem[i+1][j]; else mem[i+1][j+1] = mem[i+1][j]; } } return mem[t.length()][s.length()]; }