全组合(可包含重复字符)

前面写了篇博客,能够实现abc的组合,但是对于去重却没有考虑,下面实现全组合的去重算法:

利用链表保存结果,去除重复的串。

[cpp] view plain copy print ?
  1. #include
  2. #include
  3. usingnamespacestd;
  4. #include
  5. usingnamespacestd;
  6. typedefstructLNode{
  7. chardata[10];
  8. LNode*next;
  9. }*List;
  10. voidInsertList(List&l,chardata[])
  11. {
  12. LNode*p=newLNode;
  13. strcpy(p->data,data);
  14. if(NULL==l)
  15. p->next=NULL;
  16. else
  17. p->next=l;
  18. l=p;
  19. }
  20. voidPrint(Listl)
  21. {
  22. LNode*p=l;
  23. while(p)
  24. {
  25. cout<data<
  26. p=p->next;
  27. }
  28. }
  29. boolisContain(Listl,chardata[])
  30. {
  31. LNode*p=l;
  32. while(p&&strcmp(p->data,data)!=0)
  33. p=p->next;
  34. if(!p)
  35. returnfalse;
  36. else
  37. returntrue;
  38. }
  39. Listl=NULL;
  40. voidBacktrack(charstr[],charout[],intlength,intcurr,intstart)//全组合
  41. {
  42. for(inti=start;i
  43. {
  44. out[curr]=str[i];
  45. out[curr+1]='\0';
  46. //cout<
  47. if(!isContain(l,out))//判断是否包含此种结果,不包含则插入链表
  48. InsertList(l,out);
  49. if(i
  50. Backtrack(str,out,length,curr+1,i+1);
  51. }
  52. }
  53. voidmain()
  54. {
  55. charstr[]="1223";
  56. char*out=newchar[strlen(str)+1];
  57. Backtrack(str,out,strlen(str),0,0);
  58. Print(l);
  59. }


利用链表保存结果,去除重复的串。

[cpp] view plain copy print ?
  1. #include
  2. #include
  3. usingnamespacestd;
  4. #include
  5. usingnamespacestd;
  6. typedefstructLNode{
  7. chardata[10];
  8. LNode*next;
  9. }*List;
  10. voidInsertList(List&l,chardata[])
  11. {
  12. LNode*p=newLNode;
  13. strcpy(p->data,data);
  14. if(NULL==l)
  15. p->next=NULL;
  16. else
  17. p->next=l;
  18. l=p;
  19. }
  20. voidPrint(Listl)
  21. {
  22. LNode*p=l;
  23. while(p)
  24. {
  25. cout<data<
  26. p=p->next;
  27. }
  28. }
  29. boolisContain(Listl,chardata[])
  30. {
  31. LNode*p=l;
  32. while(p&&strcmp(p->data,data)!=0)
  33. p=p->next;
  34. if(!p)
  35. returnfalse;
  36. else
  37. returntrue;
  38. }
  39. Listl=NULL;
  40. voidBacktrack(charstr[],charout[],intlength,intcurr,intstart)//全组合
  41. {
  42. for(inti=start;i
  43. {
  44. out[curr]=str[i];
  45. out[curr+1]='\0';
  46. //cout<
  47. if(!isContain(l,out))//判断是否包含此种结果,不包含则插入链表
  48. InsertList(l,out);
  49. if(i
  50. Backtrack(str,out,length,curr+1,i+1);
  51. }
  52. }
  53. voidmain()
  54. {
  55. charstr[]="1223";
  56. char*out=newchar[strlen(str)+1];
  57. Backtrack(str,out,strlen(str),0,0);
  58. Print(l);
  59. }


你可能感兴趣的:(全组合(可包含重复字符))