392.判断子序列
这道题目算是 编辑距离问题 的入门题目(毕竟这里只是涉及到减法),慢慢的,后面就要来解决真正的 编辑距离问题了
Python:
class Solution:
def isSubsequence(self, s: str, t: str) -> bool:
n, m = len(s), len(t)
if n==0: return True
if n>m: return False
dp = [[0]*(m+1) for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, m+1):
if s[i-1]==t[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = dp[i][j-1]
if dp[i][j] == n: return True
return False
C++:
class Solution {
public:
bool isSubsequence(string s, string t) {
if (s.size()>t.size()) return false;
vector<vector<int>> dp(s.size()+1, vector<int>(t.size()+1, 0));
for (int i=1; i<=s.size(); i++) {
for (int j=1; j<=t.size(); j++) {
if (s[i-1]==t[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
else dp[i][j] = dp[i][j-1];
}
}
if (dp[s.size()][t.size()]==s.size()) return true;
return false;
}
};
115.不同的子序列
但相对于刚讲过 392.判断子序列,本题 就有难度了 ,感受一下本题和 392.判断子序列 的区别。
Python:
class Solution:
def numDistinct(self, s: str, t: str) -> int:
n, m = len(s), len(t)
dp = [[0]*(m+1) for _ in range(n+1)]
for i in range(n+1):
dp[i][0] = 1
for i in range(1, n+1):
for j in range(1, m+1):
if s[i-1]==t[j-1]:
dp[i][j] = dp[i-1][j-1]+dp[i-1][j]
else:
dp[i][j] = dp[i-1][j]
return dp[n][m]
C++:
class Solution {
public:
int numDistinct(string s, string t) {
vector<vector<unsigned long long>> dp(s.size()+1, vector<unsigned long long>(t.size()+1, 0));
for (int i=0; i<=s.size(); i++) dp[i][0] = 1;
for (int i=1; i<=s.size(); i++) {
for (int j=1; j<=t.size(); j++) {
if (s[i-1]==t[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.size()][t.size()];
}
};