Генерация всех перестановок данной строки

Возможно, не подходит для всех случаев, но для некоторых может быть сделано просто

"12".to_i   => 12
"blah".to_i => 0

.

Так что если это число, а не 0, оно вернет число. Если он возвращает 0, это либо строка слова, либо 0.

394
задан Mirzhan Irkegulov 6 June 2013 в 13:57
поделиться

1 ответ

Простая рекурсивная реализация C++ была бы похожа на это:

#include <iostream>

void generatePermutations(std::string &sequence, int index){
    if(index == sequence.size()){
        std::cout << sequence << "\n";
    } else{
        generatePermutations(sequence, index + 1);
        for(int i = index + 1 ; i < sequence.size() ; ++i){
            std::swap(sequence[index], sequence[i]);
            generatePermutations(sequence, index + 1);
            std::swap(sequence[index], sequence[i]);            
        }
    }
}

int main(int argc, char const *argv[])
{
    std::string str = "abc";
    generatePermutations(str, 0);
    return 0;
}

Вывод:

abc
acb
bac
bca
cba
cab

ОБНОВЛЕНИЕ

, Если Вы хотите сохранить результаты, можно передать vector как третий аргумент вызову функции. Кроме того, если Вы только хотите уникальные перестановки, можно использовать set.

#include <iostream>
#include <vector>
#include <set>

void generatePermutations(std::string &sequence, int index, std::vector <std::string> &v){
    if(index == sequence.size()){
        //std::cout << sequence << "\n";
        v.push_back(sequence);
    } else{
        generatePermutations(sequence, index + 1, v);
        for(int i = index + 1 ; i < sequence.size() ; ++i){
            std::swap(sequence[index], sequence[i]);
            generatePermutations(sequence, index + 1, v);
            std::swap(sequence[index], sequence[i]);            
        }
    }
}

int main(int argc, char const *argv[])
{
    std::string str = "112";
    std::vector <std::string> permutations;
    generatePermutations(str, 0, permutations);
    std::cout << "Number of permutations " << permutations.size() << "\n";
    for(const std::string &s : permutations){
        std::cout << s << "\n";
    }
    std::set <std::string> uniquePermutations(permutations.begin(), permutations.end());
    std::cout << "Number of unique permutations " << uniquePermutations.size() << "\n";
    for(const std::string &s : uniquePermutations){
        std::cout << s << "\n";
    }
    return 0;
}

Вывод:

Number of permutations 6
112
121
112
121
211
211
Number of unique permutations 3
112
121
211
0
ответ дан 22 November 2019 в 23:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: