我在网上看到了这个问题,我试图在C++
中解决它。我有以下算法:
char permutations( const char* word ){
int size = strlen( word );
if( size <= 1 ){
return word;
}
else{
string output = word[ 0 ];
for( int i = 0; i < size; i++ ){
output += permutations( word );
cout << output << endl;
output = word[ i ];
}
}
return "";
}
例如,如果我输入abc
,我想显示abc
,acb
,bac
,bca
,{{1} },cab
。
所以,我想要做的是
cba
所以我需要在每次函数调用时传递'abc' => 'a' + 'bc' => 'a' + 'b' + 'c'
=> 'a' + 'c' + 'b'
个char。
请问有人可以帮忙怎么做?
答案 0 :(得分:5)
我建议在C ++中使用algorithm
标头库来做得更容易;并且作为一个函数可以这样写:
void anagram(string input){
sort(input.begin(), input.end());
do
cout << input << endl;
while(next_permutation(input.begin(), input.end()));
}
然而,既然没有STL你想要它,你可以这样做:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap (char *x, char *y)
{
char ch = *x;
*x = *y;
*y = ch;
};
void permutate_(char* str, size_t index )
{
size_t i = 0;
size_t slen = strlen(str);
char lastChar = 0;
if (index == slen )
{
puts(str);
return;
}
for (i = index; i < slen; i++ )
{
if (lastChar == str[i])
continue;
else
lastChar = str[i];
swap(str+index, str+i);
permutate_(str, index + 1);
swap(str+index, str+i);
}
}
// pretty lame, but effective, comparitor for determining winner
static int cmpch(const void * a, const void * b)
{
return ( *(char*)a - *(char*)b );
}
// loader for real permutor
void permutate(char* str)
{
qsort(str, strlen(str), sizeof(str[0]), cmpch);
permutate_(str, 0);
}
您可以通过向其发送已排序的字符数组来调用
permutate("Hello World");
获得了非STL方法from here.
答案 1 :(得分:0)
STL很精彩:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void permutations(const char *word) {
string s = word;
sort(s.begin(), s.end());
cout << s << endl;
while(next_permutation(s.begin(), s.end()))
cout << s << endl;
}
int main() {
permutations("abc");
return 0;
}
现在,next_permutation
可以非常简单地实现。从字符串的末尾开始向后迭代,直到找到小于下一个元素的元素x
。在字符串的其余部分中使用大于x
的下一个值交换x
,然后反转之后的元素。因此,abcd
从abdc
变为c < d
;自cdba
后dabc
成为c < d
,我们翻了dcba
的最后三个字母; bdca
成为cabd
,因为b < d
我们将b
换成c
。