[Aprender programación dinámica] división de palabras (24)

Tabla de contenido

¿Cómo aprender programación dinámica?

1. Análisis del tema

2. Principio del algoritmo

1. Representación de estado

2. Ecuación de transición de estado

3. Inicialización

4. Orden de llenado

5. Valor de retorno

3. Escritura de código

Escribe al final:


¿Cómo aprender programación dinámica?

No hay atajos para aprender un algoritmo, y mucho menos aprender programación dinámica,

¡Repasen conmigo las preguntas sobre algoritmos de programación dinámica y aprendan programación dinámica juntos!

1. Análisis del tema

Enlace temático: 139. División de palabras - LeetCode 

El tema es fácil de entender, solo danos un diccionario,

Vea si puede empalmar las cadenas en el diccionario en la cadena de destino que le dio.

2. Principio del algoritmo

1. Representación de estado

dp[ i ] indica si la cadena desde el punto de inicio hasta dp[ i ] puede ser concatenada por las cadenas en el diccionario,

Si el logro es verdadero, de lo contrario es falso

2. Ecuación de transición de estado

Divide el problema según la situación de la última posición,

Podemos dividirlo en dos intervalos para el análisis,

¿Se puede empalmar con éxito la sección izquierda? ¿Es el intervalo correcto una cadena en el diccionario?

Entonces nuestra ecuación de transición de estado es:

El intervalo de la izquierda == verdadero && el intervalo de la derecha existe en el diccionario, de lo contrario es falso

3. Inicialización

Para evitar cruzar la frontera, agregue un nodo de cabeza virtual.

4. Orden de llenado

De izquierda a derecha.

5. Valor de retorno

Devuelve la última posición de la tabla dp

3. Escritura de código

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> st;
        for(auto e : wordDict) st.insert(e);

        vector<bool> dp(s.size() + 1);
        dp[0] = true;
        for(int i = 0; i <= s.size(); i++) {
            for(int j = 0; j < i; j++) {
                if(dp[j] && st.find(s.substr(j, i - j)) != st.end()) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.size()];
    }
};

Escribe al final:

Lo anterior es el contenido de este artículo, gracias por leer.

Si sientes que has ganado algo, puedes darle un me gusta al blogger .

Si hay omisiones o errores en el contenido del artículo, envíe un mensaje privado al blogger o indíquelo en el área de comentarios ~

Supongo que te gusta

Origin blog.csdn.net/Locky136/article/details/131956162
Recomendado
Clasificación