[Algoritmo] Programación dinámica - Segmentación de cadenas

describir

Dada una cadena s y un dict de palabras, determine si s se puede dividir en una secuencia de palabras con espacios de modo que todas las palabras en la secuencia de palabras sean palabras en el dict (las secuencias pueden contener una o más palabras).

Por ejemplo:
dado s="códigoahora";
dict=["ahora", "código"].
Devuelve verdadero porque "códigoahora" se puede dividir en "código ahora".

 Dividir palabras y icono-predeterminado.png?t=M0H8oraciones/clasificación de preguntas

 Ideas:

 

 Al buscar F[8], no necesita preocuparse por lo que se divide entre F[1]~F[7], solo tome el resultado.

 

 

Código:

class Solution {
public:
    bool wordBreak(string s, unordered_set<string>& dict) {
        if (s.empty())
            return false;
        if (dict.empty())
            return false;

        vector<bool> F(s.size() + 1, false);
        // 初始化F(0) = true
        F[0] = true;

        for (int i = 1; i <= s.size(); ++i)
        {
            for (int j = i - 1; j >= 0; --j)
            {
                // F(i): true{j <i && F(j) && substr[j+1,i]能在词典中找到} OR false
                // 第j+1个字符的索引为j
                if (F[j] && dict.find(s.substr(j, i - j)) != dict.end())
                {
                    F[i] = true;
                    break;
                }
            }
        }
        return F[s.size()];
    }
};

 

 

Supongo que te gusta

Origin blog.csdn.net/m0_51866180/article/details/122878629
Recomendado
Clasificación