黑马程序员技术交流社区

标题: 分享一个题目 [打印本页]

作者: 寐海流风    时间: 2014-6-23 10:48
标题: 分享一个题目
本帖最后由 寐海流风 于 2014-6-23 11:29 编辑

等待老师审阅技术博客中......
闲来无聊,想起前两天在这里看到一个帖子,大概是一个题目:
需求:输入字符串"abc",打印出:
* a b c ab ac ba bc ca cb abc acb bac bca cab cba
也就是字符串的字符的所有排列组合情况,当然打印出来的字符串中的字符不能出现相同情况;

所以自己就做了下,用了一种方法,贴出比较效率的一种方法,与大家分享。
还有没有更效率的方法呢?期待更好的方法。

/**
* 采用一个Set集合
* 集合的元素每次去遍历一个String数组,然后集合元素分别加上数组元素
* @author BeenLee
*
*/
public class StringListThree {
        
        public static void main(String[] args) {
                //传入操作对象,一个字符串
                String str = "abcdefghi";
                //字符串转为char[]数组
                char[] ch = str.toCharArray();
               
                TreeSet<String> ts = new TreeSet<>();
                //将字符串每个字符添加进TreeSet<String>
                for(int i=0;i<str.length();i++){
                        ts.add(String.valueOf(str.charAt(i)));
                }
                //做假递归运算,次数为操作对象字符串的长度-1;由于递归太占内存了,这里9个字符,怕电脑承受不了
                for(int i=0;i<str.length()-1;i++){
                        addElements(ts,ch);
                }
               
                for(String t:ts){
                        System.out.println(t);
                }
                System.out.println(ts.size());        
        }
        //定义一个方法,集合中的每个字符串,都与char[]中每个元素相加得到新字符串,并将字符串加入新集合中
        //若新字符串中,有相同字符,则过滤掉
        //最后将新集合合并到老集合中
        public static TreeSet<String> addElements(TreeSet<String> ts, char[] ch){
                //定义新集合,接收新字符串
                TreeSet<String> tss = new TreeSet<>();
                //遍历老集合中的元素,并每个元素对象与char数组中的每个元素相加,得到新字符串
                for(String t:ts){
                        for(int x=0;x<ch.length;x++){
                                //当新字符串中有相同的字符,则过滤掉,其余新字符串添加到新集合中
                                int i = t.indexOf(ch[x]);
                                if(i == -1)
                                        tss.add(t+ch[x]);
                        }
                }
                //将新集合的元素全部添加到老集合中
                ts.addAll(tss);
                return ts;
        }
}
#####################################################
入学申请还在观望中,继续优化代码!速度更快了~

//将原来的方法优化
public static TreeSet<String> addElementsLast(String str){
  
  int len = str.length();
  char[] ch = str.toCharArray();
  
  TreeSet<String> ts = new TreeSet<>();
  for(int i=0;i<len;i++){
   ts.add(String.valueOf(str.charAt(i)));
  }
  for(int i=1;i<len;i++){
   int index = 0;
   
   TreeSet<String> tss = new TreeSet<>();
   
   for(String t:ts){
    for(int x=0;x<len;x++){
     if(t.length() == i){
      
      index = t.indexOf(ch[x]);
      if(index == -1)
       tss.add(t+ch[x]);
     }
    }
   }
   
   ts.addAll(tss);
  }
  return ts;
}


作者: youngkay    时间: 2014-6-23 14:05
楼主挺厉害的,我那天看了,没什么思路,
作者: 小呀嘛小二郎    时间: 2014-6-23 15:35
好厉害,赞一个~~
作者: 寐海流风    时间: 2014-6-26 20:35
youngkay 发表于 2014-6-23 14:05
楼主挺厉害的,我那天看了,没什么思路,

感觉还可以优化,集合用的少,算法会更快写
作者: 寐海流风    时间: 2014-6-26 20:36
小呀嘛小二郎 发表于 2014-6-23 15:35
好厉害,赞一个~~

哈哈哈,就是分享出来大家鉴定下,也可以学习更好的方法
作者: youngkay    时间: 2014-6-27 13:27
寐海流风 发表于 2014-6-26 20:36
哈哈哈,就是分享出来大家鉴定下,也可以学习更好的方法

学长觉悟高啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2