2013-03-06 2 views
2

J'essaie de trouver un moyen de trouver la plus grande sous-chaîne dupliquée dans un groupe de chaînes. Le longest duplicate substring problem s'applique généralement à une seule chaîne au lieu d'un groupe de chaînes. Quel type d'algorithme serait utile pour trouver la plus grande sous-chaîne dupliquée dans un groupe de chaînes? Trouver la plus grande chaîne dupliquée dans un groupe de fichiers (afin de supprimer le code dupliqué dans les grandes bibliothèques logicielles) est le cas d'utilisation principal que j'ai à l'esprit, mais il y aurait beaucoup d'autres cas d'utilisation pour cet algorithme. .Trouver la plus longue sous-chaîne répétée dans un groupe de chaînes

Par exemple, je veux trouver la plus longue chaîne en double dans ce groupe de chaînes:

"Hello world, this is the first string." 
"Hello to the world, this is the second string." 
"Hello world. This is the third string." 
"This is the third string." 

Dans ce cas, "This is the third string." serait la plus longue chaîne répétée (ie, la plus longue chaîne qui apparaît dans plus d'une de ces chaînes).

+0

Une approche possible serait pour générer un séparateur pour chacune des chaînes, et concaténer chaque chaîne dans une chaîne, avec le séparateur étant entre chaque chaîne. Le séparateur doit être une chaîne qui n'a été trouvée dans aucune des chaînes existantes. Ensuite, je pourrais utiliser le même algorithme qui est utilisé pour trouver la plus longue sous-chaîne en double pour une seule chaîne. –

+1

@Andy Pourquoi, bonjour là! S'amuser en SMC, sommes-nous? ;) Quoi qu'il en soit, je suis assez sûr que si vous concaténer les chaînes et ensuite appliquer l'algorithme d'origine, vous pouvez avoir plus de chance. –

+0

Bien que vous souhaitiez d'abord marquer votre entrée, ne pas chercher caractère par caractère. En fonction de la manière dont vous l'implémentez, cela pourrait accélérer la mise en œuvre globale. –

Répondre

0

Peut-être this est ce que vous cherchez, mais vous devrez appliquer l'algorithme pour plus de deux chaînes. Ce qui n'est pas si dur, si vous y réfléchissez. Jetez également un coup d'œil au this page. Utiliser backtracking ne serait pas une si bonne idée.

+0

Je ' Je suis un peu confus - de quel type de retour en arrière parlez-vous? –

+0

@AndersonGreen Vous pouvez le faire avec le retour arrière, par exemple le récursif. Mais ce serait probablement la chose la plus inefficace que vous puissiez faire, si vous aviez beaucoup de ficelles ou de longues, vous pourriez vous endormir et espérer que cela se terminera jusqu'à ce que vous vous réveilliez. Jetez un oeil à LCS et LC problème de chaîne, dans les liens. Devrait être utile. En outre, la structure de données Suffix Array de simplecoder vous aidera – MihaiB

0

La réponse à votre question est commence à partir de diapositives 60 Click here

Fondamentalement, nous listons tous les sufixes possibles de l'entrée de chaîne (temps linéaire). Trier les (NlogN), et trouver la plus longue en passant par la liste triée (temps linéaire)

0
  1. Créer une Trie data structure (aliasun arbre préfixe) pour chaque chaîne
    • Appelons-le T(i) pour la chaîne i
  2. Créer une carte de hachage vide avec la clé string et la valeur int
    • Appelons M
  3. Pour chaque Trie T(i), pour chaque nœud P (où P est une chaîne de préfixe) dans T(i),
    • si la clé P est déjà en M, puis incrémenter M[P]
    • autre, insérer M[P] = 1
  4. Trouvez la (P*,C*) paire de M tels que:
    • C* >= 2 (*)
    • length(P*) est le maximum parmi toutes ces paires
  5. P* est la chaîne que vous voulez

(*) Si vous voulez obtenir la plus longue chaîne commune à K des cordes, vous devez remplacer le 2 avec K

Questions connexes