As I thought about the problem, I decided to tackle this with backtracking. Basically the idea is that I take one character out from the initial word and mark that character to note that the character has been taken out for permutation. All along, I am passing just one character array and each time I reach the end, I simply print out the resulted string.
So let me show my code.
void perm_internal(string word, char *output, int n, int k)
{
if (n == k) {
cout << "[" << output << "]" << endl;
return;
}
for (int i = 0; i < n; i++) {
if (word[i] == 0) {
continue;
}
char tmp = word[i];
output[k] = tmp;
word[i] = 0;
perm_internal(word, output, n, k+1);
word[i] = tmp;
}
}
void perm(string word)
{
int n = word.length();
char *output;
if (n == 0)
return;
output = (char *)malloc(n+1);
memset(output, 0x0, n+1);
cout << "input word: " << word << "(" << n << ")" << endl;
perm_internal(word, output, n, 0);
}
I want to try out different approaches to solve this problem but it's getting late so I will do that next time.
No comments:
Post a Comment