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 enwords
que son una subsecuencia deS
: "a", "ACD ", "as".
Nota:
- Todas las palabras
words
yS
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); } }