Возможно, не подходит для всех случаев, но для некоторых может быть сделано просто
"12".to_i => 12
"blah".to_i => 0
.
Так что если это число, а не 0, оно вернет число. Если он возвращает 0, это либо строка слова, либо 0.
Простая рекурсивная реализация 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