2010-05-23 5 views
2

Я хотел бы знать, как я могу создать различные строки из некоторых заданных символов, например:Струны Generation

данные символы: a, b

Я хотел бы генерировать следующие строки:

aa 
ab 
ba 
bb 

То, о чем я думал, имеет (только для двух входов) два для однолинейных циклов, а затем цикл каждого из числа входов, которые в этом случае равны 2, а выходные строки будут 2 * 2 = 4 строки и при увеличении числа t он число выходных строк будет увеличиваться путем умножения п * п (п-кратное)

+0

Как вы хотите, чтобы программа вела себя с более чем двумя символами ввода? –

+0

Что происходит, когда выдается три символа? Вам все еще нужны все строки длины - два, которые используют только эти символы, или длина вывода также будет равна трем? (Кроме того, если это домашнее задание, используйте тег 'homework') –

+0

Ну, BlueRaja, я забыл упомянуть, что длина строки не зависит от количества символов ввода ... поэтому у меня может быть 2 входа, а длина строки может должно быть 3 символа, поэтому выход будет следующим: aaa, aab, aba, abb, baa, bab, bba, bbb – sikas

ответ

1

Вашего подхода (насколько я понял его) хорошо звучит как первую попытку, хотя доказательство пудинга ест его, так что писать код и протестировать его :-)

Обратите внимание, что он выиграл 't масштабируется очень хорошо, поэтому вопрос заключается в том, сколько символов и сколько строк вы ожидаете получить. Если ответ «не так много», а потребление производительности/памяти не является проблемой, вполне нормально придерживаться простейшего решения, которое работает. В противном случае вам нужен более сложный алгоритм.

У меня была смутно подобная задача некоторое время назад, где количество возможных перестановок было настолько велико, что было просто недостаточно памяти для хранения каждого в одно и то же время. Таким образом, мы попытались смоделировать перестановки с номерами: обратите внимание, что любая п долго перестановка м символов может быть определена с м базового числом п цифр. Таким образом, путем повторения всех целых значений от 0 до m n, вызывая довольно простой метод преобразования, вы получаете каждую возможную строку один за другим. Для значения индекса, конечно, вам может потребоваться использовать более крупный целочисленный тип, например long long, для больших m и n значения.

+0

ну, количество символов может варьироваться от 40 до 60 и длина строки равна t 16 символам ...Я еще смог выполнить первый набор строк, я не мог перейти ко второму набору строк. – sikas

+0

@sikas: для генерации каждого 16-символьного слова из алфавита из 60 букв потребуется 25657,845,139,503,479 терабайт памяти. Я думаю, вам может понадобиться еще раз взглянуть на ваши требования (если вы надеетесь перевести 16-символьный пароль, вам не повезло - даже с каждым компьютером на Земле потребуется около 100 000 лет) –

+0

Таким образом, невозможно создать все возможные комбинации для большого количества входных символов и больших удлиненных строк ... – sikas

0

С рекурсии (только идея демонстрации):

void generate(std::string& s, size_t beg) { 
    for (char c = 'a'; c <= 'b'; ++c) { 
    s[beg] = c; 
    if (beg < s.length() - 1) { 
     generate (s, beg + 1); 
    } 
    else { 
     std::cout << s << std::endl; 
    } 
    } 
} 

int main() { 
    std::string s = "####"; 
    generate(s, 0); 
    return 0; 
} 
0

Вы можете использовать зЬй :: next_permutation. Это будет работать, даже если вы повторяете буквы (т. Е. Буквы = "ababcd").

#include <algorithm> 
#include <iostream> 
#include <string> 


int main(int argc, char** argv) { 
    std::string letters = "abcd"; 

    std::sort(letters.begin(), letters.end()); 
    do { 
     std::cout << letters << "\n"; 
    } 
    while (std::next_permutation(letters.begin(), letters.end())); 
} 
+0

+1 для использования rubenvb

+0

-1 для получения неверных результатов - это выводит две строки для примера OP, который должен иметь четыре. Он не просит перестановки ... –

+0

извините, я не знаю, почему я думал, что он просит перестановки; –