Я бы предложил использовать три .
В основном у вас есть дерево с 1 узлом на каждого уникального персонажа.
Ваш алгоритм будет O (m) как для поиска, так и для вставки, где m - длина строки.
Итак, следуя вашему примеру с:
"abcde", "hello"
"abc", "Hi"
"abcqz", "goodbye"
Тогда у вас будет следующее дерево:
a
|
b
|
c (c holds data of hi)
/ \
d q
| |
e z (z holds data of goodbye) (e holds data of hello)
Чтобы выполнить поиск, вы просто начинаете с корневого узла (корневой узел не показан выше) и следите за следующим символом во входной строке. Каждый раз, когда вы достигаете узла, на котором есть результат данных, вы будете включать его в качестве одной из ваших выходных строк.
Так что поиск abcde дал бы вам: "привет", "привет", как вы хотели. Это не даст вам «до свидания», потому что вы не прошли через этот узел результатов.