115. 不同的子序列
class Solution {
public:
int numDistinct(string s, string t) {
int result = 0;
vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1, 0)); //防溢出
if (s[0] == t[0]) dp[0][0] = 1;
for (int i = 1; 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()];
}
};
583. 两个字符串的删除操作
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, INT_MAX));
for (int i = 0; i <= word1.size(); i++) {
dp[i][0] = i;
}
for (int j = 0; j <= word2.size(); j++) {
dp[0][j] = j;
}
for (int i = 1; i <= word1.size(); i++) {
for (int j = 1; j <= word2.size(); j++) {
if (word1[i - 1] == word2[j - 1]) { //别错
dp[i][j] = dp[i - 1][j - 1];
}
else
dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
}
}
return dp[word1.size()][word2.size()];
}
};
72. 编辑距离
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1));
for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;
for (int i = 1; i <= word1.size(); i++) {
for (int j = 1; j <= word2.size(); j++) {
if (word1[i - 1] == word2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
}
else {
dp[i][j] = min(dp[i][j - 1] + 1, dp[i - 1][j] + 1); //删除/增加
dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + 1); //替换
}
}
}
return dp[word1.size()][word2.size()];
}
};
647. 回文子串
class Solution {
public:
int countSubstrings(string s) {
vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));
int result = 0;
for (int i = s.size() - 1; i >= 0; i--) {
for (int j = i; j < s.size(); j++) {
if (s[i] == s[j]) {
if (j - i <= 1) {
dp[i][j] = true;
result++;
}
else {
if (dp[i + 1][j - 1] == true) {
dp[i][j] = true;
result++;
}
}
}
}
}
return result;
}
};
516. 最长回文子序列
class Solution {
public:
int longestPalindromeSubseq(string s) {
vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0));
int result = 0;
for (int i = s.size() - 1; i >= 0; i--) {
for (int j = i; j < s.size(); j++) {
if (i == j) dp[i][j] = 1;
else if (s[i] == s[j]) {
dp[i][j] = max(dp[i + 1][j - 1] + 2, dp[i][j]);
}
else {
dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]);
}
}
}
return dp[0][s.size() - 1];
}
};