Я бы искал что-то рекурсивное, потому что мне нравится рекурсия.
Подстроки размера k в "cra":
- "c", за которым следуют подстроки размера k-1 в "ra"
- «r», за которым следуют подстроки размера k-1, - «ca»
- "a", за которым следуют подстроки размера k-1 в "cr"
Итак, если я напишу E, наборы из n символов, а e_i - его элементы.
- Substring (E, k) = {""}, если k = 0 (да, мне также нравится инициализация
повторения в 0)
- и Подстрока (E, k) = Объединение (Подстрока (e_i + Подстрока (E \ e_i, k-1)))
если k> 0
Подобные вещи лучше помещаются на черной доске, чем в цифровом тексте. Давайте попробуем простой текст:
Подстроки множества E размера k являются объединением e_i каждого элемента E подстрок, первая буква которых e_i.
Я чист? Я не знаю, ясно ли я.
После этого можно оптимизировать метод, торгуя временем вычислений для использования памяти, если вы храните промежуточные результаты, чтобы вам не приходилось вычислять их несколько раз (не имеет значения для n = 3, но это может определенно иметь значение, когда п становится большим). Если ваше начальное слово abcdefgh и k = 5, вы будете хранить такие вещи, как подстрока ("cdefgh", 3), так что вам не нужно будет вычислять его как для слов, начинающихся с a, так и для слов, начинающихся с b. Вы сэкономите много времени на вычисления, но при большом n может потребоваться много памяти. Если у вас есть пороговое значение для памяти, лучше хранить подстроки для наименьшего k, как те, которые будут запрашиваться чаще всего (конец дерева рекурсии).
Последний вопрос: как его хранить? Я бы выбрал карту, используя пару ("cdefgh", 3) или даже только "cdefgh" в качестве ключа и набор подстрок в качестве значения.