[LC] 792. Número de subsecuencias a Juego

Cadena dada  S y un diccionario de palabras  words, encontrar el número de  words[i] que es una subsecuencia de  S.

Ejemplo: 
Entrada: 
S = "abcde" 
palabras = [ "a", "BB", "ACD", "as"] 
de salida: 3 
Explicación: Hay tres palabras en wordsque son una subsecuencia de S: "a", "ACD ", "as".

Nota:

  • Todas las palabras  words y  S sólo se compone de letras minúsculas.
  • La longitud de  S estará en la gama de  [1, 50000].
  • La longitud de  words estará en la gama de  [1, 5000].
  • La longitud de  words[i] estará en la gama de  [1, 50].

Solución 1: TLE

clase de soluciones {
     público  int numMatchingSubseq (String S, String [] palabras) {
         int res = 0 ;
        para (String palabra: palabras) {
             int WordIndex = 0 ;
            para ( int i = 0; i <s.length (); i ++ ) {
                 si (S.charAt (i) == word.charAt (WordIndex)) { 
                    WordIndex + = 1 ; 
                } 
                Si (WordIndex == word.length ()) { 
                    res + = 1 ;
                    descanso ;
                } 
            } 
        } 
        Volver res; 
    } 
}

 

Solución 2:

clase de soluciones {
     público  int numMatchingSubseq (String S, String [] palabras) {
         int res = 0 ; 
        Lista <Integer> [] indexArr = getIndex (S);
        para (String palabra: palabras) {
             int curIndex = 0 ;
            para ( int i = 0; i <word.length (); i ++ ) { 
                curIndex = getPos (indexArr [word.charAt (i) - 'a' ], curIndex);
                si (curIndex == -1 ) {
                     descanso ; 
                } 
                curIndex+ = 1 ; 
            } 
            Si (curIndex = -1! ) { 
                Res + = 1 ; 
            } 
        } 
        Volver res; 
    } 
    
    Privada List <Integer> [] getIndex (String str) { 
        Lista <entero> [] = indexArr nueva Lista [26 ];
        para ( int i = 0; i <str.length (); i ++ ) {
             si (indexArr [str.charAt (i) - 'a'] == nula ) { 
                indexArr [str.charAt (i) - 'a' ] = nuevo ArrayList <> (); 
            } 
            IndexArr [str.charAt (i) - 'a' ] .add (i); 
        } 
        Devolver indexArr; 
    } 
    
    Privados  int getPos (List <Integer> lista, int act) {
         si (== lista nula ) {
             retorno de -1 ; 
        } 
        Int izquierda = 0 ;
        int derecha = list.size () - 1 ;
        si (list.get (izquierda)> = act) {
             retorno list.get (a la izquierda); 
        } 
        Si (list.get (derecha) < act) {
            volver -1; 
        } 
        Mientras que (izquierda < derecha) {
             int mediados = Izquierda + (derecha - izquierda) / 2 ;
            si (list.get (medio) == act) {
                 retorno list.get (medio); 
            } Demás  si (list.get (MID) < act) { 
                izquierda = centro + 1 ; 
            } Demás { 
                derecha = mediados; 
            } 
        } 
        Retorno list.get (a la izquierda); 
    } 
}

 

Supongo que te gusta

Origin www.cnblogs.com/xuanlu/p/12618602.html
Recomendado
Clasificación