本帖最后由 寐海流风 于 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;
}
|
|