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 , la valeur maximale de n1 est 10 ^ 6, et le calcul global est …
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: ,
- Complexité de l'espace: ,
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 s2 se trouvent dans , et retournent finalement Voilà.
- Temps mort encore ...
Optimisation 2:
- Si s1 caractères restants n'est pas
s2.length()
un mot, à la fin.