一家搜索公司的面试题,当时有这个概念,但是没写出代码,思路不清晰,回来想了下,很简单。
void loop(char* str, int real_size)
{
int size = strlen(str);
if(size == 0)
printf("%s\n", str - real_size);
for(int i = 0; i < size; i++){
swap(str[0], str[i]);
loop(str + 1, real_size);
swap(str[i], str[0]);
}
}
思想是:当确定一个位置的字符后,所有全排列的个数就是其后字符串全排列的个数。
如果字符串内有重复的怎么办?从上面的代码可以看到,其实我们是选择了一个当前位置的字符,然后对剩下的字符做了秭归处理,所以关键是选择的当前字符不能有重复。新的代码如下(假设字符串已经有序):
void loop(char* str, int real_size)
{
int size = strlen(str);
if(size == 0)
printf("%s\n", str - real_size);
for(int i = 0; i < size; i++){
swap(str[0], str[i]);
loop(str + 1, real_size);
swap(str[i], str[0]);
while(str[i] == str[i + 1]) i++;
}
}