Lors d'un premier passage sur inputString, nous pouvons compter la fréquence d'apparition de chaque caractère et supprimer ceux dont l'occurrence est 1.
input: inputString
data strucutres:
Set<Triple<char[], Integer, Integer>> potentialSecondWords;
Map<Char, List<Integer>> lettersList;
for the characters c with increasing index h in inputString do
if (!lettersList.get(c).isEmpty()) {
for ((secondWord, currentIndex, maxIndex) in potentialSecondWords) {
if (there exists a j in lettersList.get(c) between currentIndex and maxIndex) {
update (secondWord, currentIndex, maxIndex) by adding c to secondWord and replacing currentIndex with j;
}
}
if potentialSecondWords contains a triple whose char[] is equal to c, remove it;
put new Triple with value (c,lettersList.get(c).get(0), h-1) into potentialSecondWords;
}
lettersList.get(c).add(h);
}
find the largest secondWord in potentialSecondWords and output secondWord twice;
donc cet algorithme passe une fois sur le réseau, ce qui crée pour chaque index, où il est logique, un triple représentant le deuxième mot potentiel à partir de l'indice actuel et met à jour tous les deuxièmes potentiels mots. Avec une implémentation de liste appropriée et n étant la taille de inputString, cet algorithme a l'exécution O dans le cas le plus défavorable (n²), par ex. pour un^n.
Je ne comprends pas. Où est 'abc' n'importe où dans la première chaîne? Et pourquoi le résultat de la deuxième chaîne n'est-il pas 'aaa'? Clairement c'est plus long. –
Je suppose que la sous-séquence ne signifie pas que les indices doivent être consécutifs. Le résultat obtenu est soit [index 0, index 1], [index 1, index 2] ou [index 0, index 2]. – DaveFar
aaa a "aa" résultat parce que dans "aa" la première moitié est la même que la seconde moitié. – test