Leetcode 392. 判断子序列
题目:392. 判断子序列
解析:代码随想录解析
解题思路
双指针
一个一个匹配的dp数组
代码
//双指针
class Solution {
public boolean isSubsequence(String s, String t) {
int slow = 0, fast = 0;
int sLen = s.length(), tLen = t.length();
for (; fast < tLen; fast++) {
if (slow >= sLen)
break;
if (s.charAt(slow) == t.charAt(fast))
slow++;
}
return slow == sLen;
}
}
//dp
class Solution {
public boolean isSubsequence(String s, String t) {
int m = s.length();
int n = t.length();
int [][]dp = new int[m+1][n+1];
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] + 1;
else
dp[i][j] = dp[i][j-1];
}
}
return dp[m][n] == m;
}
}
总结
暂无
Leetcode 115. 不同的子序列
题目:115. 不同的子序列
解析:代码随想录解析
解题思路
dp数组的含义是到这位置有多少个匹配到j的组合,所以dp[m][n]的含义是有多少个匹配到字符串s的组合
代码
class Solution {
public int numDistinct(String s, String t) {
// 0 b a g
//0 1 0 0 0
//b 1 1 0 0
//a 1 1 1 0
//b 1 2 2 0
//g 1 2 2 2
//b 1 3 3 3
//a 1 3 4 4
//g 1 3 4 5
int m = s.length();
int n = t.length();
int [][]dp = new int[m+1][n+1];
for (int i = 0; i <= m; i++)
dp[i][0] = 1;
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];
else
dp[i][j] = dp[i-1][j];
}
}
return dp[m][n];
}
}
总结
暂无