Directorio de artículos
1. 97. Cuerdas entrelazadas
1. Introducción al tema
97. Cadenas entrelazadas
Dadas tres cadenas s1, s2, s3, ayude a verificar si s3 está compuesta de s1 y s2 entrelazadas.
La definición y el proceso de entrelazar dos cadenas s y t son los siguientes, donde cada cadena se dividirá en varias subcadenas no vacías:
s = s1 + s2 + … + sn
t = t1 + t2 + … + tm
|n - m | <= 1
entrelazado es s1 + t1 + s2 + t2 + s3 + t3 + … o t1 + s1 + t2 + s2 + t3 + s3 + … Nota
: a + b significa cadenas a y b concatenadas.
2. Ideas para resolver problemas
3.Código
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
if(s3.size() != s1.size() + s2.size()) return false;
vector<bool> v(s2.size() + 1, false);
vector<vector<bool>> dp(s1.size() + 1, v);
dp[0][0] = true;
for(int i = 1;i <= s1.size(); ++i)
{
dp[i][0] = s1[i - 1] == s3[i - 1] && dp[i - 1][0];
}
for(int j = 1;j <= s2.size(); ++j)
{
dp[0][j] = s2[j - 1] == s3[j - 1] && dp[0][j - 1];
}
dp[0][0] = true;
for(int i = 1;i <= s1.size(); ++i)
{
for(int j = 1;j <= s2.size(); ++j)
{
if((s1[i - 1] == s3[i + j - 1] && dp[i - 1][j]) || (s2[j - 1] == s3[i + j - 1] && dp[i][j - 1]))
dp[i][j] = true;
}
}
return dp[s1.size()][s2.size()];
}
};
4. Resultados de ejecución
2. 712. Suma mínima de eliminación ASCII de dos cadenas
- Cadenas entrelazadas, 712. Suma mínima de eliminación ASCII de dos cadenas, 718. Subarreglo repetido más largo
1. Introducción al tema
712. Suma mínima ASCII eliminada de dos cadenas.
Dadas dos cadenas s1 y s2, devuelve la suma mínima de valores ASCII de caracteres eliminados necesarios para que las dos cadenas sean iguales.
2. Ideas para resolver problemas
3.Código
class Solution {
public:
int minimumDeleteSum(string s1, string s2) {
vector<int> v(s2.size() + 1, 0);
vector<vector<int>> dp(s1.size() + 1, v);
//dp[i][j]表示以i-1为结尾的字符串s1,和以j-1为结尾的字符串s2的公共子序列字符之和
for(int i = 1;i <= s1.size(); ++i)
{
for(int j = 1;j <= s2.size(); ++j)
{
if(s1[i - 1] == s2[j - 1])
{
dp[i][j] = dp[i - 1][j - 1] + s1[i - 1];
}
else
{
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
int sum = 0;
for(auto& e : s1)
{
sum += e;
}
for(auto& e : s2)
{
sum += e;
}
return sum - 2 * dp[s1.size()][s2.size()];
}
};
4. Resultados de ejecución
3. 718. Subarreglo repetido más largo
1. Introducción al tema
718. El subarreglo repetido más largo.
Dadas dos matrices de números enteros nums1 y nums2, devuelve la longitud del subarreglo común y más largo en las dos matrices.
2. Ideas para resolver problemas
3.Código
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
vector<int> v(nums2.size() + 1, 0);
vector<vector<int>> dp(nums1.size() + 1, v);
int ret = 0;
for(int i = 1;i <= nums1.size(); ++i)
{
for(int j = 1;j <= nums2.size(); ++j)
{
if(nums1[i - 1] == nums2[j - 1])
{
dp[i][j] = dp[i - 1][j - 1] + 1;
}
ret = max(ret, dp[i][j]);
}
}
return ret;
}
};
4. Resultados de ejecución
Resumir
Hoy es el día 14 de práctica de algoritmos.
El éxito viene de pensar, el fracaso viene de seguir , sigue trabajando duro.
Fuente: LeetCode, los derechos de autor pertenecen a LeetCode.
Si este artículo os ha inspirado, espero que podáis apoyar más al autor, ¡gracias a todos!