输出字符串的全排列
2018-10-08 本文已影响0人
小码弟
输出字符串的所有组合
这题适合使用递归,固定一个字符,求余下子字符串的全排列
以'abc'为例:
1、 固定第一个字符'a',对余下子串'bc'求全排列
2、将'a'与第二个字符'b'交换,然后固定此时的第一个字符'b',对余下子串'ac'求全排列
3、由于2步打乱了源字符串的顺序,先交换'a'<--> 'b',再把'a'与第三个字符'c'交换后,固定这时的第一个字符'c', 求余下子串'ba'的全排列
未命名文件.png
/*
@参数:
Str: 待排序的字符串
SubStr:待排序的余下子串
*/
void Permutation(char* Str, char* SubStr)
{
if(Str == NULL || SubStr == NULL)
return;
if(*SubStr == '\0')
// 一次排列完成,输出结果
print("%s", Str)
else{
for(char* p=SubStr; *p != '\0'; p++)
{
// 交换SubStr和当前遍历到的p
swap(SubStr, p);
// 固定第一个字符,对余下子串求全排列
Permutation(Str, SubStr+1);
// 还原
swap(SubStr, p);
}
}
}
//调用
str='abc';
Permutation(str, str);