题目:打印字符串全排列
分析:递归实现,两步,第一步首位pbegin与数组中的其他值交换,第二步,在交换的基础上,也就是固定了首位,将余下的部分重复第一步,其实有第三步就是换回来
void Permutation(char* pStr, char* pBegin)
{
if (*pBegin=='\0') {
printf("%s \n",pStr);
return ;
}
for (char *pch=pBegin; *pch!='\0'; pch++) {
swap(*pch, *pBegin);
Permutation(pStr, pBegin+1);
swap(*pch, *pBegin);//要换回来,这样pch的值才是正确的,要不会出现重复,我就是卡在这
}
}
这种解答是当字符串中没有重复值的时候,那么解决重复值的问题,比如1222,换第一个位置有2122,2212,2221,但是222之间不需要交换了
bool IsSwap(char *pBegin,char *pEnd)//判断区间上是否重复
{
while (pBegin<pEnd) {
if (*pBegin==*pEnd) {
return false;
}
pBegin++;
}
return true;
}
void Permutation(char* pStr, char* pBegin)
{
if (*pBegin=='\0') {
printf("%s \n",pStr);
return ;
}
for (char *pch=pBegin; *pch!='\0'; pch++) {
if (IsSwap(pBegin,pch)) {
swap(*pch, *pBegin);
Permutation(pStr, pBegin+1);
swap(*pch, *pBegin);
}
}
}