LeetCode820. Codificación comprimida de palabras [Mediano] - Conjunto de series de preguntas diarias

Descripción del título:

Dada una lista de palabras, codificamos esta lista en una cadena de índice S y una lista de índice A.

Por ejemplo, si la lista es ["tiempo", "yo", "campana"], podemos expresarla como S = "tiempo # campana #" e índices = [0, 2, 5].

Para cada índice, podemos restaurar la lista de palabras anterior leyendo la cadena desde la posición indexada en la cadena S hasta el final de "#".

Entonces, ¿cuál es la longitud mínima de cadena para codificar con éxito una lista de palabras dada?

Mi solucion:

1. Primero pensé en el algoritmo KMP, porque lo conocí ayer. . . Funciona, pero el límite de tiempo se excede cuando la lista es demasiado grande

Pero estoy muy feliz de escribir el algoritmo KMP en combinación con esta pregunta.

El siguiente código es intransitable

class Solution {
public:
    int* func(string s){
        int *next=new int[s.length()];
        int i=0,j=-1;
        next[0]=-1;
        while(i<s.length()-1){
            if(j==-1||s[i]==s[j]){
                i++;
                j++;
                next[i]=j;
            }
            else    j=next[j];
        }
        return next;
    }
    int minimumLengthEncoding(vector<string>& words) {
        int a=0;
        vector<string> v;
        if(words.size())    v.push_back(words[0]);
        for(int i=1;i<words.size();i++){
            for(int j=0;j<v.size();j++){
                int m=0,n=0;
                int a=int(v[j].length());
                int b=int(words[i].length());
                if(a>=b){
                    int *next1=func(words[i]);
                    while(m<a&&n<b){
                        if(n==-1||v[j][m]==words[i][n]){
                            m++;
                            n++;
                        }
                        else    n=next1[n];
                    }
                    if(n!=int(words[i].length())) {   v.push_back(words[i]);}
                }
                    else{
                        int *next=func(v[j]);
                        while(m<a&&n<b){
                        if(m==-1||v[j][m]==words[i][n]){
                            m++;
                            n++;
                        }
                        else    m=next[m];
                        }
                    if(m==int(v[j].length()))    v[j]=words[i];
                    }
            }
        }
        int sum=0;
        for(string &s:v){
            sum+=1;
            sum+=s.length();
        }
        return sum;
    }
};

2. Consulte el código oficial y use set

unordered_set <string> ss (words.begin (), words.end ()); '

A través de esta pregunta, también entiendo un poco el conjunto

class Solution {
public:
    int minimumLengthEncoding(vector<string>& words) {
        unordered_set<string> ss(words.begin(),words.end());
        for(string &s:words){
            for(int i=1;i<int(s.length());i++){
                ss.erase(s.substr(i));
            }
        }
        int sum=0;
        for(const string &s:ss){
            sum+=1;
            sum+=s.length();
        }
        return sum;
    }
};

66 artículos originales publicados · Me gusta1 · Visitas 503

Supongo que te gusta

Origin blog.csdn.net/qq_41041762/article/details/105154636
Recomendado
Clasificación