day54
1、leetcode392 判断子序列
- 
动规五部曲 - 
dp[i] [j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i] [j]。 
- 
递推公式 if(s.charAt(i-1) == t.charAt(j-1)) { dp[i][j] = dp[i-1][j-1] + 1; } else { dp[i][j] = dp[i][j-1]; }
- 
初始化 - dp[0] [0] = 0
- dp[1] [0] = 0
- 初始化为0
 
- 
遍历顺序 - 从上到下,从左到右
 
- 
举例 
 
- 
- 
代码 class Solution { public boolean isSubsequence(String s, String t) { int[][] dp = new int[s.length()+1][t.length()+1]; for(int i=1; i<=s.length(); i++) { for(int j=1; j<=t.length(); j++) { if(s.charAt(i-1) == t.charAt(j-1)) { dp[i][j] = dp[i-1][j-1] + 1; } else { dp[i][j] = dp[i][j-1]; } } } return dp[s.length()][t.length()]==s.length(); } }
- 
双指针法 class Solution { public boolean isSubsequence(String s, String t) { if(s.length()==0) { return true; } int slow = 0; for(int fast=0; fast<t.length() && slow<s.length(); fast++) { if(t.charAt(fast) == s.charAt(slow)) { slow++; } } return slow==s.length(); } }
2、leetcode115 不同的子序列
- 
动规五部曲 - 
dp[i] [j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i] [j] 
- 
递推公式 - 
s[i - 1] 与 t[j - 1]相等 - 
一部分是用s[i - 1]来匹配,那么个数为dp[i - 1] [j - 1]。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dp[i-1] [j-1]。 
- 
一部分是不用s[i - 1]来匹配,个数为dp[i - 1] [j]。(就是模拟在s中删除这个元素) dp[i] [j] = dp[i - 1] [j - 1] + dp[i - 1] [j]; 
 
- 
- 
s[i - 1] 与 t[j - 1] 不相等 - 不用s[i - 1]来匹配 dp[i] [j] = dp[i - 1] [j];
 
 
- 
- 
初始化 - dp[i] [0] = 1:把以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1
- dp[0] [j] = 0:空字符串s可以随便删除元素,出现以j-1为结尾的字符串t的个数。s如论如何也变成不了t。
- dp[0] [0] = 1
 
- 
遍历顺序 - 从上到下,从左到右
 
- 
举例 
 
- 
- 
代码 class Solution { public int numDistinct(String s, String t) { int[][] dp = new int[s.length()+1][t.length()+1]; for(int i=0; i<=s.length(); i++) dp[i][0] = 1; for(int j=1; j<=t.length(); j++) dp[0][j] = 0; for(int i=1; i<=s.length(); i++) { for(int j=1; j<=t.length(); j++) { if(s.charAt(i-1) == t.charAt(j-1)) { dp[i][j] = dp[i-1][j-1] + dp[i-1][j]; } else { dp[i][j] = dp[i-1][j]; } } } return dp[s.length()][t.length()]; } }
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号