#include <stdio.h> #include <string.h> #include <stdlib.h> void swap(char *i1, char *i2) { char tmp = *i1; *i1 = *i2; *i2 = tmp; } /* algorithm * - rotating and pinning prefix substrings * - for example if "abc" is the string * - rotate the letter 'a' in passed index * to remaining places in the string:(0,1,2) * - foreach such combination * - pin prefix; rotate remaining substring * * - abc - abc * - acb * abc - bac - bac * - bca * - cba - cba * - cab */ void permute(char *s, int index) { if ( index == strlen(s) ) { printf("%s\n",s); return; } /* rotate s[index] from: index --> end of string */ for(int i=index;i<strlen(s);i++) { swap(&s[index],&s[i]); /* pin substring from: 0 --> index+1 */ permute(s,index+1); swap(&s[index],&s[i]); } } int main(int argc,char **argv) { if ( argc>1 ) { char *s = malloc(strlen(argv[1])+1); strcpy(s,argv[1]); permute(s,0); } }
Oct 12, 2011
generating permutations - part deux
I was never too happy with my string permutation generation algorithm. I am happy to come back to this subject, and present a way more simpler algorithm to print permutations. I call this the 'rotating' & 'pinning' algorithm. It works by changing in the passed string (so its not immutable); and then restores back the original string before proceeding ahead (it uses back tracking).
Labels:
code permutations
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment