Как получить все одно и двух буквенные комбинации по порядку из слова?
Самое простое рекуррентное соотношение:
Все раскладки по слову "program" - это, во первых, все раскладки для "rogram" с префиксом "p-", во вторых, все раскладки для "ogram" с префиксом "pr-". Ну и частные случаи слова из одной буквы и пустого. Вроде с таким подходом удобно будет применить StringBuffer
p-r-o-g-r-a-m (0)

pr-o-g-r-a-m (1)
p-ro-g-r-a-m
p-r-og-r-a-m
p-r-o-gr-a-m
p-r-o-g-ra-m
p-r-o-g-r-am

pr-og-r-a-m (2)
pr-o-gr-a-m
pr-o-g-ra-m
pr-o-g-r-am
p-ro-gr-a-m
p-ro-g-ra-m
p-ro-g-r-am
p-r-og-ra-m
p-r-og-r-am
p-r-o-gr-am

pr-og-ra-m (3)
pr-og-r-am
pr-o-gr-am
p-ro-gr-am

я бы делал с использование рекурсии