输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻

  1. importjava.util.ArrayList;
  2. importjava.util.List;
  3. importjava.util.Set;
  4. importjava.util.TreeSet;
  5. /**
  6. *
  7. *@author赵学庆www.java2000.net //摘录此人的作品
  8. *
  9. */
  10. publicclassT{
  11. publicstaticList<String>find(List<String>list){
  12. List<String>rtn=newArrayList<String>();
  13. Stringstr;
  14. for(inti=0;i<list.size();i++){
  15. str=list.get(i);
  16. list.remove(i);
  17. if(list.size()==0){
  18. rtn.add(str);
  19. }else{
  20. List<String>sList=find(list);
  21. for(Strings:sList){
  22. rtn.add(str+s);
  23. if(s.length()==5){
  24. addNumber(str+s);
  25. }
  26. }
  27. }
  28. list.add(i,str);
  29. }
  30. returnrtn;
  31. }
  32. publicstaticvoidaddNumber(Stringstr){
  33. if(str.charAt(2)=='4'||str.contains("35")||str.contains("53")){
  34. return;
  35. }
  36. set.add(str);
  37. }
  38. publicstaticSet<String>set=newTreeSet<String>();
  39. publicstaticvoidmain(String[]args){
  40. List<String>list=newArrayList<String>();
  41. list.add("1");
  42. list.add("2");
  43. list.add("2");
  44. list.add("3");
  45. list.add("4");
  46. list.add("5");
  47. find(list);
  48. System.out.println(set.size());
  49. intcols=10;
  50. for(Strings:set){
  51. System.out.print(s+"");
  52. if(cols--==1){
  53. System.out.println();
  54. cols=10;
  55. }
  56. }
  57. }
  58. }

网友提供的一个比较优化的算法

  1. importjava.util.Set;
  2. importjava.util.TreeSet
  3. /**
  4. *原始版本没有考虑重复问题,我进行了修正.<br>
  5. *此算法的精华就是,让一个字符串的所有位置都进行互换,<br>
  6. *这样就产生了所有可能出现的字符串。
  7. *
  8. *@author赵学庆,nicky_zs<ahref="http://www.java2000.net">www.java2000.net</a>
  9. */
  10. publicclassMyTest{
  11. publicstaticvoidmain(Stringargs[]){
  12. char[]number=newchar[]{'1','2','2','3','4','5'};
  13. perm(number,0,number.length-1);
  14. System.out.println(set.size());
  15. intcols=10;
  16. for(Strings:set){
  17. System.out.print(s+"");
  18. if(cols--==1){
  19. System.out.println();
  20. cols=10;
  21. }
  22. }
  23. }
  24. publicstaticvoidaddNumber(Stringstr){
  25. set.add(str);
  26. }
  27. publicstaticSet<String>set=newTreeSet<String>();
  28. publicstaticvoidperm(char[]n,intbeg,intend){
  29. if(beg==end){
  30. Stringresult=String.valueOf(n);
  31. if(n[2]=='4')
  32. return;
  33. if(result.contains("35")||result.contains("53"))
  34. return;
  35. addNumber(String.valueOf(n));
  36. return;
  37. }
  38. for(inti=beg;i<=end;++i){
  39. swap(n,beg,i);
  40. perm(n,beg+1,end);
  41. swap(n,beg,i);
  42. }
  43. }
  44. publicstaticintnumber=0;
  45. publicstaticvoidswap(char[]n,inta,intb){
  46. chartemp=n[a];
  47. n[a]=n[b];
  48. n[b]=temp;
  49. }
  50. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值