Permutations of a String

Question: Print all the permutations of a string. Write code in C.

Answer: Here is a recursive solution to print all the permutations of a string. However, this solution does not take care of duplicates. It is assumed that there are no duplicates in the string. I left out the implementation of the swap method since that implementation is not important here.

The idea is to keep the first character constant and generate permutations with the rest. Then keep the first two characters constant and generate permutations with the rest until you are out of characters :)

void permutate( char[] str, int index )
{
    int i = 0;
    if( index == strlen(str) )
    { // We have a permutation so print it
        printf(str);
        return;
    }
    for( i = index; i < strlen(str); i++ )
    {
        swap( str[index], str[i] ); // It doesn't matter how you swap.
        permutate( str, index + 1 );
        swap( str[index], str[i] );
    }
}
permutate( "abcdefgh", 0 );

Now what do we do if there are duplicates in the string? The trick is to sort the characters in the alphabetical order first. We can then ignore the duplicates easily when generate the permutation.

void permutate( char[] str, int index )
{
    int i = 0;
    static lastChar = 0;
    if( index == strlen(str) )
    { // We have a permutation so print it
        printf(str);
        return;
    }
    for( i = index; i < strlen(str); i++ )
    {
        if( lastChar == str[i] ) {
            continue;
        } else {
            lastChar = str[i];
        }
        swap( str[index], str[i] ); // It doesn't matter how you swap.
        permutate( str, index + 1 );
        swap( str[index], str[i] );
    }
}
permutate( sort("Hello World"), 0 );

Simple right? Any comments or suggestions are always welcome.

Like this post? Please Digg it or Stumble it.

Get a free subscription to Oracle magazine published by Oracle Corp.
 Powered by Max Banner Ads 

Related posts:

  1. Combinations of a String
  2. Reverse a String
  3. Anagrams in an Array of Strings
  4. Reverse the Order of Words in a String
  5. First Non-Repeated Character

2 Responses

  1. Blech. Far too complex for a simple problem. Here’s a simpler and easier to understand solution in ActionScript 3 (nothing fancy) that yields no duplicates.


    function p(s:String, pre:String):void {
    if (s.length < 1)
    trace(pre);
    else
    for (var i:int = 0; i < s.length; i++)
    p(s.substr(0,i) + s.substr(i+1), pre + s.charAt(i));
    }

    p("abcd", "");

  2. LeFunk says:

    Nah, the latter function creates duplicates, if some characters repeat in the word – try “poop” for example.

Leave a Reply

Using Gravatars in the comments - get your own and be recognized!

XHTML: These are some of the tags you can use: <a href=""> <b> <blockquote> <code> <em> <i> <strike> <strong>