Print all the permutations of a string in C

前端 未结 8 1383
自闭症患者
自闭症患者 2020-11-29 04:06

I am learning backtracking and recursion and I am stuck at an algorithm for printing all the permutations of a string. I solved it using the bell algorithm for permutation b

相关标签:
8条回答
  • 2020-11-29 04:38

    Recursion really simplifies it:

    public static void permutation(String str) 
    { 
        permutation("", str); 
    }
    
    private static void permutation(String prefix, String str) 
    {
        int n = str.length();
        if (n == 0) {
            System.out.println(prefix);
        } else {
            for (int i = 0; i < n; i++)
                permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n));
        }
    }
    
    0 讨论(0)
  • 2020-11-29 04:43

    The code that you found is correct! The algorithm swaps the current character in the string with all the subsequent characters and recursively calling the function. Its difficult to explain in words. The figure below may be of some help to you.

    Backracking is being done in the 2nd swap for reversing the effect of the 1st swap i.e. we are going back to the original string and will now swap the next character in the array with the current character. The time complexity of the algo. is O(n*n!) since the loop runs n times and the permute function is called n! times. (For the 1st iteration, its called n times; for 2nd iteration (n-1) times and so on).

    Recursion tree for permutations of string "ABC"

    Source: http://www.geeksforgeeks.org/write-a-c-program-to-print-all-permutations-of-a-given-string/

    0 讨论(0)
  • 2020-11-29 04:50
    # include <stdio.h>
    
    /* Function to swap values at two pointers */
    void swap (char *x, char *y)
    {
         char temp;
         temp = *x;
         *x = *y;
         *y = temp;
    }
    
    /* Function to print permutations of string
        This function takes three parameters:
        1. String
        2. Starting index of the string
        3. Ending index of the string. */
    void permute(char *a, int i, int n)
    {
        int j;
        if (i == n)
          printf("%s\n", a);
        else
        {
              for (j = i; j <= n; j++)
             {
                 swap((a+i), (a+j));
                 permute(a, i+1, n);
                 swap((a+i), (a+j)); //backtrack
             }
        }
    }
    
    /* Driver program to test above functions */
    int main()
    {
        char a[] = "ABC";
        permute(a, 0, 2);
        getchar();
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-29 04:51

    The algorithm basically works on this logic:

    All permutations of a string X is the same thing as all permutations of each possible character in X, combined with all permutations of the string X without that letter in it.

    That is to say, all permutations of "abcd" are

    • "a" concatenated with all permutations of "bcd"
    • "b" concatenated with all permutations of "acd"
    • "c" concatenated with all permutations of "bad"
    • "d" concatenated with all permutations of "bca"

    This algorithm in particular instead of performing recursion on substrings, performs the recursion in place on the input string, using up no additional memory for allocating substrings. The "backtracking" undoes the changes to the string, leaving it in its original state.

    0 讨论(0)
  • 2020-11-29 04:53
    def perms(s):
        if len(s) < 1:
            return [s]
        ps = []
        for i in range(0, len(s)):
            head, tail = s[i], s[0:i] + s[i + 1:]
            ps.extend([head + tailp for tailp in perms(tail)])
        return ps
    
    0 讨论(0)
  • 2020-11-29 04:55

    Pseudo code:

    String permute(String a[])
    {
      if (a[].length == 1)
         return a[];
      for (i = 0, i < a[].length(); i++)
        append(a[i], permute(a[].remove(i)));
    }
    
    0 讨论(0)
提交回复
热议问题