1143.最长公共子序列
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
int m = text1.size(), n = text2.size(), ans = 0;
vector<vector<int>> dp(m, vector<int>(n, 0)); // 到i,j最长公共字符的长度
for(int i = 0; i < n; i++){
if(text1[0] == text2[i]){
dp[0][i] = 1;
ans = 1;
for(int j = i + 1; j < n; j++){
dp[0][j] = 1;
}
break;
}
}
for(int i = 0; i < m; i++){
if(text2[0] == text1[i]){
dp[i][0] = 1;
ans = 1;
for(int j = i + 1; j < m; j++){
dp[j][0] = 1;
}
break;
}
}
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
if(text1[i] == text2[j]){
dp[i][j] = dp[i - 1][j - 1] + 1;
}else{
dp[i][j] = max(max(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]);
}
ans = max(dp[i][j], ans);
}
}
return ans;
}
};
1035.不相交的线
class Solution {
public:
int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size(), n = nums2.size(), ans = 0;
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); // 到i,j最多划线
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(nums1[i - 1] == nums2[j - 1]){
dp[i][j] = dp[i - 1][j - 1] + 1;
}else{
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
ans = max(dp[i][j], ans);
}
}
return ans;
}
};
53. 最大子序和
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size() == 0){
return 0;
}
int ans = nums[0], curSum = 0;
int right = 0, n = nums.size();
while(right < n){
curSum = max(curSum + nums[right], nums[right]);
ans = max(ans, curSum);
right++;
}
return ans;
}
};
392.判断子序列
官方题解
class Solution {
public:
bool isSubsequence(string s, string t) {
int n = t.size();
vector<vector<int>> letterPos(n + 1, vector<int>(26, n)); // 位置i后,字母j出现的位置
for(int i = n - 1; i >= 0; i--){
for(int j = 0; j < 26; j++){
if(t[i] == j + 'a'){
letterPos[i][j] = i;
}else{
letterPos[i][j] = letterPos[i + 1][j];
}
}
}
int next = 0;
for(int i = 0; i < s.size(); i++){
if(letterPos[next][s[i] - 'a'] == n){
return false;
}else{
next = letterPos[next][s[i] - 'a'] + 1;
}
}
return true;
}
};