Может быть, я не до конца понимаю вопрос. В любом случае, я покажу вам очень простое решение, но без использования стека. Если у вас есть требования использовать стек, рекурсивные вызовы или что-то еще, пожалуйста, прокомментируйте, и я разработаю новый ответ.
Но давайте сначала посмотрим на алгоритм. Что вам нужно, это какая-то «комбинация подмножеств» всех букв. Правильный подход заключается в использовании так называемого Power Set и для расчета всех необходимых подмножеств. Это очень просто, используя двоичное представление общего количества подмножеств. Для всех подмножеств набора мощности, в которых установлен бит, мы растянем соответствующую букву.
Растянуть в этом контексте означает просто повторить это k раз.
Предостережение , Поскольку мы используем unsigned long long
в качестве идентификатора блока питания, мы можем обрабатывать строки с максимальной длиной 64. Но поверьте мне. Это приведет к тому, что множество подмножеств будет недоступно для вашего компьютера.
Итак, полученный код довольно прост, но требует 3 вложенных цикла.
Пожалуйста, см .:
#include <iostream>
#include <string>
#include <list>
#include <vector>
#include <algorithm>
#include <iterator>
// Make typing easier
using ULL = unsigned long long;
std::list<std::string> stretch(std::string input, size_t k)
{
// Resulting list. Initialize with given string
std::list<std::string> result{ input };
// Go through all requested depths
for (size_t depth = 0U; depth < k-1; ++depth) {
// Go through all possible power-set sub-sets for selecting 1 or more letters
for (ULL subSetID = 1ULL ; subSetID < (1ULL << static_cast<ULL>(input.size())); ++subSetID) {
// Bit mask, for checking, if a bit in the sub-set is set
ULL bitMask{ 1ULL };
// In here, we build the string from a letter or stretched letter
std::string temp{};
// Go through all letters of the input string
for (const char letter : input) {
// Check, if the bit mask for this powerset element is set, then stretch, else. take letter as is
temp += std::string(1, letter) + (((subSetID & bitMask) == bitMask) ? std::string(depth + 1, letter) : "");
// Check next bit
bitMask <<= 1;
}
// Store the new found string in the resulting list
result.push_back(temp);
}
}
return result;
}
int main() {
// Test for string abc with depth 2
std::list<std::string> l{ stretch("abc",2) };
// Show result on screen
std::copy(l.begin(), l.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}