字符串全排列递归实现(避免重复),这段代码哪位高手能说下思路,看不懂哇

字符串全排列递归实现(避免重复),这段代码谁能说下思路,看不懂哇

#include<stdio.h>
#include<string.h>
#define N 10
char s[N], t[N];

void convert(char *strSource, char *strTarget, int nLen)
{
int i, j;
char strConvert[10];

if(nLen == 1)
{
strTarget[0] = strSource[0];
printf("%s\n", t);
return;
}
else
{
for(i=0; i<nLen; i++)
{
for(j=0; j<i && strSource[i] != strSource[j]; j++);
if(j == i)
{
strTarget[0] = strSource[i];
memcpy(strConvert, strSource, i);
memcpy(strConvert+i, strSource+i+1, nLen-i-1);
convert(strConvert, strTarget+1, nLen-1);
}
}
}
}

void main()
{
int n;
scanf("%s",s);
memset(t, 0, N);
printf("全排列是:\n");
convert(s, t, strlen(s));
}

字符串全排列递归实现(避免重复),这段代码哪位高手能说下思路,看不懂哇
如果不管重复的话会输出4!=24个,上面这段代码避免了重复输出,所以输出了12个。请问这段代码是怎么避免重复输出的?

------解决思路----------------------
 只从问题角度去分析下  
 1. 观察问题1123全排列
 2.从递归角度实现全排列来看 思路可能是 求1123递归 只需要先求123的递归 递归下去。。。
 3.从代码输出角度分析 观察全排列重复的情况,你会发现1123全排列之所以会重复是因为出现了俩个相临位数的相同导致的而
 strSource[i] != strSource[j]在for中 且第一次不会判断 说明第二次如果俩个位数相同就不会再进入这个判断了 既相邻的不进行递归。

------解决思路----------------------
思路是:
1.轮流选取S[N]中的各个位作为第一位。如果第i位字符在[0,i-1]这个区间内出现过,就不再对其进行排列,因为把它放在第一位的所有排列在前面排列过了(就是代码中j作为循环变量的作用)。
2.把当前选取的这一位放入目标数组中
3.用一个临时数组保存剩余的字符,并把其作为源。同时目标数组的地址下移一位,因为当前位已经排列好。
4.递归
从1可以看出,这个算法是不会有重复排列的。
另外其他的一些注释:
if(nLen == 1)
{
strTarget[0] = strSource[0];//拷贝最后一位
printf("%s\n", t);
return;
}

for(i=0; i<nLen; i++)
{
for(j=0; j<i && strSource[i] != strSource[j]; j++);//判断[0~i-1]区间内是否有与strSource[i]相同的字符,如果有则以strSource[i]开头的所有排列在j这个位置就已经做过,所以不再进行排列。
if(j == i)
{
strTarget[0] = strSource[i];//把strSource[i]作为排列的第一位。
memcpy(strConvert, strSource, i);
memcpy(strConvert+i, strSource+i+1, nLen-i-1);//这两行是把源字符串中剩余部分拷贝到临时数组中,因为strSource[i]的位置已经排好了
convert(strConvert, strTarget+1, nLen-1);
}
}