Write a C program to print all permutations of a given string. Below are the permutations of string ABC.
Variation 1:
Given a string s and a string t, check if s is sub-sequence of t. A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ace" is a subsequence of "abcde" while "aec" is not).
http://www.programcreek.com/2015/09/leetcode-is-subsequence-java/
Variation 1:
Print all distinct permutations of a given string with duplicates
http://www.geeksforgeeks.org/print-all-permutations-of-a-string-with-duplicates-allowed-in-input-string/
Variation 2: Find Whether Two Strings are Permutation of each other
http://algorithms.tutorialhorizon.com/find-whether-two-strings-are-permutation-of-each-other/
Variation 3:
Given a string s and a string t, check if s is sub-sequence of t. A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ace" is a subsequence of "abcde" while "aec" is not).
http://www.programcreek.com/2015/09/leetcode-is-subsequence-java/
Variation 1:
Print all distinct permutations of a given string with duplicates
http://www.geeksforgeeks.org/print-all-permutations-of-a-string-with-duplicates-allowed-in-input-string/
Variation 2: Find Whether Two Strings are Permutation of each other
http://algorithms.tutorialhorizon.com/find-whether-two-strings-are-permutation-of-each-other/
Variation 3:
Write an algorithm to Print All the Well Ordered Permutations of a Given String. When all the alphabets in a string occur in the increasing order irrespective of Lower Case or Upper case.
Iterative:
#include <stdio.h>
#include <conio.h>
#define SIZE 3
int main(char *argv[],int argc)
{
char list[3]={'a','b','c'};
int i,j,k;
for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
for(k=0;k<SIZE;k++)
if(i!=j && j!=k && i!=k)
printf("%c%c%c\n",list[i],list[j],list[k]);
getch();
return(0);
}
Recursive:
1st Approach:Below are the permutations of string ABC.
ABC, ACB, BAC, BCA, CAB, CBA
Here is a solution using backtracking.
Code:
# include <stdio.h>
/* Function to swap values at two pointers */
void
swap (
char
*x,
char
*y)
{
char
temp;
temp = *x;
*x = *y;
*y = temp;
}
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
}
}
}
int
main()
{
char
a[] =
"ABC"
;
permute(a, 0, 2);
getchar
();
return
0;
}
Algorithm Paradigm: Backtracking
Time Complexity: O(n*n!)
2nd Approach:
Let’s assume a given string S represented by the letters A1, A2, A3, ..., An
To permute set S, we can select the first character, A1, permute the remainder of the string to get a new list. Then, with that new list, we can “push” A1 into each possible position.
For example, if our string is “abc”, we would do the following:
1. Let first = “a” and let remainder = “bc”
2. Let list = permute(bc) = {“bc”, “cd”}
3. Push “a” into each location of “bc” (--> “abc”, “bac”, “bca”) and “cb” (--> “acb”, “cab”, “cba”)
4. Return our new list
Pseudo Code:
1. Set index = 0 to point to the 1st character in the input string 2. If index = n-1 return last character (n is length of input string) 3. Get Permutations of string starting at index + 1 4. For each permutation in the list from step 3 a. Insert input[index] character in all possible positions of each permutation. Example: input = "abc" get permutations for "bc": "bc" and "cb" insert "a" in all positions of both "bc" and "cb": "a" * "bc": "abc", "bac", "bca" "a" * "cb": "acb", "cab", "cba"
The 2nd approach would be preferable given that the there are only n
recursive calls compared to n! recursive calls of the 1st approach.
No comments:
Post a Comment