Edit: dla sklarowanego pytanie:
- posortować ciągi
- znaleźć najdłuższy wspólny przedrostek każdej sąsiedniej pary
- sortować i DeDupe wspólne prefiksy, a następnie usunąć dowolny to ścisła prefiksem inne.
W rzeczywistości krok (3) wymaga jedynie usunięcia wszystkich duplikatów/przedrostków innego, które można wykonać przy użyciu trie lub innego rodzaju sortowania. W rzeczywistości może być tak, że cała sprawa może być wykonana szybciej z odpowiednio opisanym trie - jeśli w każdym węźle znajduje się "licznik", to szukasz właśnie węzłów o liczbie 2+, które nie mają dzieci z liczba 2+.
Ale sortowanie jest wbudowane, a po posortowaniu można wykryć przedrostki, patrząc na sąsiednie przedmioty, więc to prawdopodobnie mniej wysiłku.
[odpowiedź oryginalny:
Tylko operacja jednorazowa, znajdź najdłuższy wspólny przedrostek między wszystkimi strun?
Prawdopodobnie zrobiłbym to pod względem długości prefiksu. Pseudo-kod, przy założeniu, ciągi nul zakończone:
prefixlen = strlen(first_string);
foreach string in the list {
for (i = 0; i < prefixlen; ++i) {
if (string[i] != first_string[i]) {
prefixlen = i;
break;
}
}
if (prefixlen == 0) break;
}
common_prefix = substring(firststring, 0, prefixlen);
]
Więc chcesz, aby wszystkie ciągi były takie, że 's' jest wspólnym przedrostkiem dwóch ciągów na liście, a' s' nie jest ścisłym podciągiem jakiegokolwiek innego wspólnego przedrostka tych samych dwóch ciągów, oraz 's' nie jest pustym ciągiem? Co z '{" a1 "," a2 "," ab1 "," ab2 "}', czy chcesz '" a "' czy nie? –
Tak, zgadza się. I nie, nie potrzebuję. – cfischer