[String] A001_Statistiques du nombre de répétitions (violence / optimisation)

1. Problème

La chaîne S est composée de n chaînes concaténées s, notées S = [s, n] Par exemple, ["abc", 3] = "abcabcabc".

Si nous pouvons supprimer certains caractères de s2 pour en faire s1, alors disons que la chaîne s1 peut être obtenue à partir de la chaîne s2. Par exemple, par définition, "abc" peut être obtenu auprès de "abdbec", mais pas de "acbbe".

Vous disposez maintenant de deux chaînes non vides s1 et s2 (chacune comptant jusqu'à 100 caractères) et de deux entiers 0 ≤ n1 ≤ 106 et 1 ≤ n2 ≤ 106. Considérons maintenant les chaînes S1 et S2, où S1 = [s1, n1] et S2 = [s2, n2].

Veuillez trouver un entier maximum M pouvant satisfaire [S2, M] à partir de S1.

S1 satisfait [S2, M]
, c'est-à-dire acbacbacbacb. Après avoir supprimé tous les caractères, le nombre maximal d'abab apparaîtra.
Supprimez tous les c dans S1, puis les lettres restantes sont composées de 2 ababs,
donc retournez 2
c'est-à-dire M = 2, S1 = [S2, 2]

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

返回:
2

Deuxièmement, la solution

Méthode 1: adaptation de la force brute

Énumérer s1, puis compter le nombre d'occurrences de s2 dans s1.

Erreur de temporisation: la complexité temporelle d'une telle correspondance de force brute est Le ( 100 n 1 ) O (100 * n1) , la valeur maximale de n1 est 10 ^ 6, et le calcul global est 1 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;
}

Analyse de complexité

  • Complexité temporelle: O ( 100 × n 1 ) O (100 × n1)
  • Complexité de l'espace: O ( n ) O (n)

Méthode 2: optimisation de la force brute

Optimisation un:

  • Nous avons besoin de [s1, n1]la trouver [s2, n2] × M, trouver le maximum de M.
  • Nous n'avons pas besoin de raccorder s2 n2 fois, au lieu de cela nous s 1 × n 1 s1 × n1 s2 se trouvent dans , et retournent finalement T n 2 \ cfrac {T} {n2} Voilà.
  • Temps mort encore ...

Optimisation 2:

  • Si s1 caractères restants n'est pas s2.length()un mot, à la fin.
Publié 714 articles originaux · loué 199 · 50 000+ vues

Je suppose que tu aimes

Origine blog.csdn.net/qq_43539599/article/details/105625096
conseillé
Classement