LeetCode:392. 判断子序列 - 力扣(LeetCode)
1.思路
遍历原字符串t,判断s和t的字符是否相同,相同则两者同时++;否则循环遍历,每轮都对当前位置与s的长度比较判断,如果相同则到达末尾,表示s是t的子串。
2.代码实现
// 双指针
class Solution {
public boolean isSubsequence(String s, String t) {
if (s.length() == 0) {
return true;
}
int i = 0;
for (int j = 0; j < t.length(); j++) {
if (s.charAt(i) == t.charAt(j)) {
i++;
if (i == s.length()) {
return true;
}
}
}
return false;
}
}
// 动态规划
class Solution {
public boolean isSubsequence(String s, String t) {
// dp[i][j],表示以 i - 1, j - 1 为结尾的重复子序列的个数
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];
}
}
}
if (dp[s.length()][t.length()] == s.length()) {
return true;
} else {
return false;
}
}
}
3.复杂度分析
时间复杂度:O(n).
空间复杂度:O(n).
LeetCode:115. 不同的子序列 - 力扣(LeetCode)
1.思路
2.代码实现
class Solution {
public int numDistinct(String s, String t) {
int[][] dp = new int[s.length() + 1][t.length() + 1];
// dp[i][j],表示以 i - 1 为结尾的 s 中有以 j - 1 为结尾的 t 的个数
for (int i = 0; i < s.length(); i++) {
dp[i][0] = 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] + dp[i - 1][j];
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[s.length()][t.length()];
}
}
3.复杂度分析
时间复杂度:O(n^2).
空间复杂度:O(n).