Comment puis-je trouver toutes les permutations d'une chaîne sans utiliser la récursivité?
Quelqu'un peut m'aider avec ceci: C'est un programme pour trouver toutes les permutations d'une chaîne de caractères de longueur quelconque. Besoin d'un non-récursive forme de la même. ( C langage de mise en œuvre de préférence)
using namespace std;
string swtch(string topermute, int x, int y)
{
string newstring = topermute;
newstring[x] = newstring[y];
newstring[y] = topermute[x]; //avoids temp variable
return newstring;
}
void permute(string topermute, int place)
{
if(place == topermute.length() - 1)
{
cout<<topermute<<endl;
}
for(int nextchar = place; nextchar < topermute.length(); nextchar++)
{
permute(swtch(topermute, place, nextchar),place+1);
}
}
int main(int argc, char* argv[])
{
if(argc!=2)
{
cout<<"Proper input is 'permute string'";
return 1;
}
permute(argv[1], 0);
return 0;
}
Ce n'est pas un langage "C" solution - vous êtes à l'aide d'un type de chaîne, le cout, la surcharge d'opérateur... Ce ne pouvait pas être plus du C++ si elle a été écrite par Stroustrup lui-même.
Vous êtes de droite. [c] de la balise supprimés pour économiser de l'éditer.
J'étais allusion au fait que je voulais un C mise en œuvre de ce code C++
Vous êtes de droite. [c] de la balise supprimés pour économiser de l'éditer.
J'étais allusion au fait que je voulais un C mise en œuvre de ce code C++
OriginalL'auteur Shrinidhi | 2009-08-25
Vous devez vous connecter pour publier un commentaire.
Une pile non-récursive équivalent de votre code:
J'ai essayé de faire en C et éviter c++ conteneurs STL et les fonctions membres (utilisé un constructeur pour des raisons de simplicité).
Remarque, les permutations sont générés dans l'ordre inverse à l'original.
Je dois ajouter que, à l'aide d'une pile de cette manière est tout simplement de simuler la récursivité.
OriginalL'auteur jon-hanson
Une autre approche serait d'allouer un tableau de n! des tableaux de char et les remplir de la même manière que vous le feriez par la main.
Si la chaîne est "abcd", mettre tous de la "une" chars en position 0 pour le premier n-1! tableaux, dans la position 1 pour le prochain n-1! tableaux, etc. Ensuite, mettre tous les "b" chars en position 1 pour le premier n-2! tableaux, etc, tous les "c" chars en position 2 pour le premier n-3! tableaux, etc, et tous les "d" chars en position 3 pour le premier n-4! tableaux, etc, en utilisant le modulo n de l'arithmétique, dans chaque cas, de passer de la position 3 à la position 0 parce que vous êtes en train de remplir les tableaux.
Sans échange est nécessaire et de vous savoir au plus tôt si vous avez assez de mémoire pour stocker les résultats ou pas.
OriginalL'auteur user1522420
Premier de conseils - ne pas passer std:chaîne d'arguments par valeur. Utiliser const références
Il vous permettra d'économiser beaucoup de copie inutile.
Comme pour C++ solution, vous disposez des fonctions
std::next_permutation
etstd::prev_permutation
dansalgorithm
en-tête. Vous pouvez donc écrire:Comme pour la C la solution, vous avez à changer les variables de types de std::string en char * (pouah, et vous avez à gérer la mémoire correctement). Je pense approche similaire - l'écriture de fonctions
avec la même sémantique que les fonctions STL - fera. Vous pouvez trouver le code source pour
std::next_permutation
avec explication ici. J'espère que vous parvenez à écrire un code similaire qui fonctionne sur char * (BTW std::next_permutation peut travailler avec char * pas de problèmes, mais vous avez voulu C) comme je suis trop paresseux pour le faire par moi-même 🙂OriginalL'auteur Tadeusz Kopec
Avez-vous essayé d'utiliser la STL? Il existe un algorithme appelé next_permutation qui donné une gamme retourne true, sur chaque appel ultérieur jusqu'à ce que toutes les permutations ont été rencontrées. Ne fonctionne pas seulement sur les chaînes, mais sur une "séquence" de type.
http://www.sgi.com/tech/stl/next_permutation.html
Oui c'est une bonne page avec des explications sur la façon dont il est utilisé, juste pour vous dire que il y a aussi un std::fonction prev_permutation trouvé dans les algorithmes.
OriginalL'auteur
Cela résout le problème sans récursivité. Le seul problème est qu'il va générer des doublons de sortie dans le cas où un caractère est répété dans la chaîne.
Pas une solution complète au problème, à partir de n!/De 2 à n! les valeurs sont répétées de 1 à n!/2
OriginalL'auteur crashed
OriginalL'auteur Susheel Hoolihalli