Problème 1 : 1143. Sous-séquence commune la plus longue - LeetCode
Étant donné deux chaînes text1
et , renvoie la longueur de la sous-séquence communetext2
la plus longue de ces deux chaînes . Renvoie si aucune sous-séquence commune n'existe .0
Une sous-séquence d'une chaîne fait référence à une telle nouvelle chaîne : il s'agit d'une nouvelle chaîne formée en supprimant certains caractères (ou en ne supprimant aucun caractère) de la chaîne d'origine sans changer l'ordre relatif des caractères.
- Par exemple,
"ace"
est"abcde"
une sous-séquence de , mais"aec"
pas"abcde"
une sous-séquence de .
Une sous-séquence commune de deux chaînes est une sous-séquence que les deux chaînes ont en commun
Idée : définir un dp[i][j] bidimensionnel, qui représente la plus longue sous-séquence commune des combinaisons i et j. Si le même élément est trouvé lors du parcours, alors dp[i][j] = dp [i- 1][j-1]+1, le code est le suivant :
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
vector<vector<int>> dp(text1.size()+1,vector<int>(text2.size()+1,0));
for(int i = 1;i <= text1.size();i++){
for(int j = 1; j <= text2.size();j++){
if(text1[i-1] == text2[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
}
else{
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[text1.size()][text2.size()];
}
} ;
Problème 2 : 1035. Lignes disjointes - LeetCode
Étant donné un tableau d'entiers nums
, veuillez trouver un sous-tableau continu avec la somme maximale (le sous-tableau contient au moins un élément) et renvoyer sa somme maximale.
Un sous-tableau est une partie contiguë d'un tableau.
Idée : Réfléchir à cette question revient en fait à la sous-séquence commune la plus longue, qui peut être obtenue en listant plusieurs formules récursives. Le code spécifique est le suivant :
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size() == 1) return nums[0];
vector<int> dp(nums.size(),0);
int result = nums[0];
dp[0] = nums[0];
for(int i = 1; i < nums.size(); i++){
dp[i] = max(nums[i],dp[i-1] + nums[i]);
if(dp[i] > result) result = dp[i];
}
return result;
}
};
Problème 3 : 53. Somme maximale du sous-tableau - LeetCode
Étant donné un tableau d'entiers nums
, veuillez trouver un sous-tableau continu avec la somme maximale (le sous-tableau contient au moins un élément) et renvoyer sa somme maximale.
Un sous-tableau est une partie contiguë d'un tableau.
Idée : trouver la somme maximale du sous-tableau, dp représente la somme maximale du sous-tableau lorsque le i-ème élément est présent, la formule récursive est dp[i]=max(nums[i],dp[i-1]+ nums[i]), Le code spécifique est le suivant :
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size() == 0) return 0;
vector<int> dp(nums.size(),0);
int result = nums[0];
dp[0] = nums[0];
for(int i = 1; i < nums.size(); i++){
dp[i] = max(nums[i],dp[i-1] + nums[i]);
if(dp[i] > result) result = dp[i];
}
return result;
}
};