Supposons que l'on nous donne une collection de chaînes, S 1 , … , S n . Je voudrais savoir si l'une de ces chaînes est une sous-chaîne d'une autre chaîne de la collection. En d'autres termes, j'aimerais un algorithme pour la tâche suivante:
Entrée:
Sortie: telle que S i est une sous-chaîne de S j et i ≠ j , ou None si aucune telle i , j n'existe
Existe-t-il un algorithme efficace pour cela?
Si nous remplaçons «sous-chaîne» par «préfixe», il existe un algorithme efficace (triez les chaînes, puis effectuez un balayage linéaire pour comparer les chaînes adjacentes; le tri garantira que les sous-chaînes sont adjacentes). Mais il semble plus difficile de tester si une chaîne est une sous-chaîne d'une autre chaîne. Un algorithme naïf consiste à parcourir toutes les paires , mais cela nécessite des tests de sous-chaîne Θ ( n 2 ) . Existe-t-il un algorithme plus efficace?
Je suppose que nous pourrions appeler cela "test de sous-chaîne toutes paires", ou quelque chose comme ça.
Mon but ultime est d'élaguer la collection afin qu'aucune chaîne ne soit une sous-chaîne d'une autre, en supprimant chacune qui est une sous-chaîne de quelque chose d'autre dans la collection.