LeetCode 刷题【115. 不同的子序列】
115. 不同的子序列
自己做
解1:递归(超时)
class Solution {private int sum = 0;public void search(String s, int i, String t, int j){if(j == t.length()){ //匹配上的情况sum++;return;}if(s.length() - i < t.length() - j) //剪枝=》表示就算后面元素全部能匹配上t,但是最后t仍然不可能匹配完return;while(s.charAt(i) != t.charAt(j)){ //跳过不匹配的字符 i++;if(i == s.length()) //越界了还没有找到->直接返回return; }//遇到匹配的字符search(s, i + 1, t, j); //不选当前字符search(s, i + 1, t, j + 1); //选当前字符}public int numDistinct(String s, String t) {search(s, 0, t, 0);return sum;}
}
解2:动态规划【歇菜】
看题解
官方题解:
class Solution {public int numDistinct(String s, String t) {int m = s.length(), n = t.length();if (m < n) {return 0;}int[][] dp = new int[m + 1][n + 1];for (int i = 0; i <= m; i++) {dp[i][n] = 1;}for (int i = m - 1; i >= 0; i--) {char sChar = s.charAt(i);for (int j = n - 1; j >= 0; j--) {char tChar = t.charAt(j);if (sChar == tChar) {dp[i][j] = dp[i + 1][j + 1] + dp[i + 1][j];} else {dp[i][j] = dp[i + 1][j];}}}return dp[0][0];}
}
优化自己的代码
class Solution {public int numDistinct(String s, String t) {int m = s.length();int n = t.length();int[][] DP = new int[m + 1][n + 1];//初始化for(int i = 0; i <= m; i++) //初始化第一列【s必然匹配空的t】DP[i][0] = 1;for(int j = 1; j <= n; j++) //初始化第一行【空的s必然不匹配不为空的t】DP[0][j] = 0;for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++)if(s.charAt(i - 1) == t.charAt(j - 1))DP[i][j] = DP[i - 1][j - 1] + DP[i - 1][j];elseDP[i][j] = DP[i - 1][j];return DP[m][n];}
}