[String] A001_Statistik der Anzahl der Wiederholungen (Gewalt / Optimierung)

1. Problem

Die Zeichenfolge S besteht aus n verketteten Zeichenfolgen s, die als S = [s, n] bezeichnet werden. Zum Beispiel ["abc", 3] = "abcabcabc".

Wenn wir einige Zeichen aus s2 löschen können, um es zu s1 zu machen, sagen wir, dass die Zeichenfolge s1 aus der Zeichenfolge s2 erhalten werden kann. Zum Beispiel kann per Definition "abc" von "abdbec" erhalten werden, aber nicht von "acbbe".

Jetzt erhalten Sie zwei nicht leere Zeichenfolgen s1 und s2 (jeweils bis zu 100 Zeichen lang) und zwei Ganzzahlen 0 ≤ n1 ≤ 106 und 1 ≤ n2 ≤ 106. Betrachten Sie nun die Zeichenfolgen S1 und S2, wobei S1 = [s1, n1] und S2 = [s2, n2].

Finden Sie eine maximale ganze Zahl M, die [S2, M] von S1 erfüllen kann.

S1 erfüllt [S2, M]
, dh acbacbacbacb. Nach dem Löschen von Zeichen wird die maximale Anzahl von Ababs angezeigt.
Löschen Sie alle c in S1, dann bestehen die verbleibenden Buchstaben aus 2 Ababs. Geben Sie
also 2 zurück
, dh M = 2, S1 = [S2, 2]

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

返回:
2

Zweitens Lösung

Methode 1: Brute-Force-Matching

Zählen Sie s1 auf und zählen Sie dann die Anzahl der Vorkommen von s2 in s1.

Timeout-Fehler: Die zeitliche Komplexität einer solchen Brute-Force-Anpassung ist Die ( 100 n 1 ) O (100 · n1) beträgt der Maximalwert von n1 10 ^ 6 und die Gesamtberechnung ist 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;
}

Komplexitätsanalyse

  • Zeitliche Komplexität: O ( 100 × n 1 ) O (100 × n1)
  • Raumkomplexität: O ( n ) O (n)

Methode 2: Brute-Force-Optimierung

Optimierung eins:

  • Wir brauchen [s1, n1]den Fund [s2, n2] × M, finden das Maximum von M.
  • Wir müssen s2 n2 nicht mal spleißen, sondern direkt s 1 × n 1 s1 × n1 s2 werden in und kehren schließlich zurück T n 2 \ cfrac {T} {n2} Das war's.
  • Immer noch Timeout ...

Optimierung 2:

  • Wenn s1 verbleibende Zeichen ist nicht s2.length()ein Wort, bis zum Ende.
Veröffentlicht 714 Originalarbeiten · erntete Lob 199 · betrachtet 50000 +

Ich denke du magst

Origin blog.csdn.net/qq_43539599/article/details/105625096
Empfohlen
Rangfolge