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

hope2reality 2014-10-31 03:33:07

#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个。请问这段代码是怎么避免重复输出的?
...全文
293 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hope2reality 2014-11-03
  • 打赏
  • 举报
回复
@zzyafyj,十分感谢!
zzyazzy 2014-10-31
  • 打赏
  • 举报
回复
思路是: 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); } }
hope2reality 2014-10-31
  • 打赏
  • 举报
回复
引用 1 楼 u011779875 的回复:
只从问题角度去分析下 1. 观察问题1123全排列 2.从递归角度实现全排列来看 思路可能是 求1123递归 只需要先求123的递归 递归下去。。。 3.从代码输出角度分析 观察全排列重复的情况,你会发现1123全排列之所以会重复是因为出现了俩个相临位数的相同导致的而 strSource[i] != strSource[j]在for中 且第一次不会判断 说明第二次如果俩个位数相同就不会再进入这个判断了 既相邻的不进行递归。
如果输入1213,全排列还是12个。所以这个程序不管重复的字符是否相邻都可以输出正确答案。
做或不做 2014-10-31
  • 打赏
  • 举报
回复
只从问题角度去分析下 1. 观察问题1123全排列 2.从递归角度实现全排列来看 思路可能是 求1123递归 只需要先求123的递归 递归下去。。。 3.从代码输出角度分析 观察全排列重复的情况,你会发现1123全排列之所以会重复是因为出现了俩个相临位数的相同导致的而 strSource[i] != strSource[j]在for中 且第一次不会判断 说明第二次如果俩个位数相同就不会再进入这个判断了 既相邻的不进行递归。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧