[Cadena] A001_Estadísticas del número de repeticiones (violento / optimizado)

1. problema

La cadena S está compuesta de n cadenas concatenadas s, denotadas como S = [s, n]. Por ejemplo, ["abc", 3] = "abcabcabc".

Si podemos eliminar algunos caracteres de s2 para convertirlo en s1, entonces digamos que la cadena s1 se puede obtener de la cadena s2. Por ejemplo, por definición, "abc" puede obtenerse de "abdbec", pero no de "acbbe".

Ahora se le dan dos cadenas no vacías s1 y s2 (cada una de hasta 100 caracteres de longitud) y dos enteros 0 ≤ n1 ≤ 106 y 1 ≤ n2 ≤ 106. Ahora considere las cadenas S1 y S2, donde S1 = [s1, n1] y S2 = [s2, n2].

Encuentre un número entero máximo M que pueda satisfacer [S2, M] de S1.

S1 satisface [S2, M]
, es decir, acbacbacbacb. Después de eliminar cualquier carácter, aparecerá el número máximo de abab.
Elimine todas las c en S1, luego las letras restantes consisten en 2 ababs,
así que devuelva 2
que es M = 2, S1 = [S2, 2]

输入:
s1 ="acb",n1 = 4
s2 ="ab",n2 = 2

返回:
2

Segundo, solución

Método 1: coincidencia de fuerza bruta

Enumere s1, luego cuente el número de ocurrencias de s2 en s1.

Error de tiempo de espera: la complejidad de tiempo de dicha coincidencia de fuerza bruta es El ( 100 norte 1 ) O (100 * n1) , el valor máximo de n1 es 10 ^ 6, y el cálculo general es 1 0 0 8 10 ^ 8 ...

public int getMaxRepetitions(String s1, int n1, String s2, int n2) {
    StringBuilder sb1 = new StringBuilder(s1);
    StringBuilder sb2 = new StringBuilder(s2);
    for (int i = 1; i < n1; i++) sb1.append(s1);
    for (int i = 1; i < n2; i++) sb2.append(s2);
    
    int M = 0, k = 0;
    for (int i = 0; i < sb1.length(); i++) {
        if (sb1.charAt(i) == sb2.charAt(k)) {
            k++;
        }
        if (k == sb2.length()) {
            M++;
            k = 0;
        }
    }
    return M;
}

Análisis de complejidad.

  • Complejidad del tiempo: O ( 100 × n 1 ) O (100 × n1)
  • Complejidad espacial: O ( n ) O (n)

Método 2: optimización de fuerza bruta

Optimización uno:

  • Necesitamos [s1, n1]el hallazgo [s2, n2] × M, encontrar el máximo de M.
  • No necesitamos empalmar s2 n2 veces, sino que directamente s 1 × n 1 s1 × n1 s2 se encuentran en , y finalmente regresan T n 2 \ cfrac {T} {n2} Eso es todo
  • Todavía tiempo de espera ...

Optimización 2:

  • Si s1 caracteres restante no es s2.length()una palabra, hasta el final.
Publicado 714 artículos originales · elogiado 199 · 50,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_43539599/article/details/105625096
Recomendado
Clasificación