[Ejercicio de algoritmo de programación dinámica] día 14


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.
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

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

Insertar descripción de la imagen aquí

2. 712. Suma mínima de eliminación ASCII de dos cadenas

  1. 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.
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

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

Insertar descripción de la imagen aquí

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.
Insertar descripción de la imagen aquí

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

Insertar descripción de la imagen aquí


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!

Supongo que te gusta

Origin blog.csdn.net/xjjxjy_2021/article/details/131463166
Recomendado
Clasificación