Отредактировано после получения ответов
Некоторые отличные ответы здесь. Мне нравится Джош, потому что он такой умный и использует C ++. Однако я решил принять ответ Дейва из-за его простоты и рекурсии. Я проверил их обоих, и они дали одинаковые правильные результаты (хотя и в другом порядке). Итак, еще раз спасибо всем.
Скажем, у меня есть строка s символов s [0]: s [N] и где каждый символ s [i] <= s [i + 1]
Например строка </p>
aaacdddghzz
Я хочу создать все комбинации подстрок, сохраняя при этом одинаковые отношения между символами.
Так, например, я бы получил
a
aa
aaa
ad
aad
aaad
add
aadd
aaadd
addd
aaddd
aaaddd
d
dd
ddd
.
.
.
ac
aac
.
.
.
acdddghzz
aacdddghzz
aaacdddghzz
Но не
ca
hdz
...etc
Теперь я знаю, как определить количество комбинаций. Вы создаете гистограмму частоты букв в строке. Так что в приведенном выше примере это будет
Для строки aaacdddghzz
a=3
d=3
c=1
g=1
h=1
z=2
и формула (a+1)(c+1)(d+1)(g+1)(h+1)(z+1) = 4*4*2*2*2*3 = 384
. Есть 384 подстроки, которые поддерживают отношение s [i] <= s [i + 1]. </p>
Итак, вопрос в том, как мне сгенерировать эти 384 подстроки рекурсивно? На самом деле итеративный метод был бы таким же хорошим, может быть, лучше, так как большие строки с множеством уникальных символов могут вызвать переполнение стека. Это звучит как домашнее задание, но это не так. Я просто бесполезен при разработке таких алгоритмов. Я использую C ++, но псевдокод будет в порядке.