- /**
- * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
- * 原始字符串是"abc",打印得到下列所有组合情况:
- * "a" "b" "c"
- * "ab" "bc" "ca" "ba" "cb" "ac"
- * "abc" "acb" "bac" "bca" "cab" "cba"
- */
- import java.util.*;
- class StringToArray{
- public static void main(String[] args)
- {
- inputString();
- }
- //手动输入字符串
- public static void inputString()
- {
- TreeSet<String> ts = new TreeSet<String>(new StringCmp());//创建存储集合
- Scanner scanner = new Scanner(System.in);//键盘输入
- System.out.println("请输入一个字符串:");
- String str = scanner.next();//从键盘获取字符串
- char[] buf = str.toCharArray();//将字符串转换成字符数组
- allArray(buf,ts,0,buf.length-1);//调用字符串全部组合函数
- Iterator<String> it = ts.iterator();//创建迭代器
- int len = 1;
- System.out.println(str+"的全部组合为"+ts.size()+"个:");
- while (it.hasNext())//按照字符串的长度迭代字符串组合
- {
- String s = it.next();
- if(len<s.length())
- {
- len++;
- System.out.println();
- }
- System.out.print(s+"\t");
- }
- scanner.close();
- }
- public static void allArray(char[] buf,TreeSet<String> ts,int start,int end)
- {
- StringBuffer sb = new StringBuffer();//创建临时存储区
- for(int i=start;i<=end;i++)
- {
- swap(buf,start,i);//交换数组第一个元素与后续的元素
-
- allArray(buf,ts,start+1,end);//后续元素递归交换
- for(int j=0;j<=start;j++)
- sb.append(buf[j]); //将各个字符添加到临时存储区
- ts.add(sb.toString());//将临时存储区的字符串添加进集合中
- sb.delete(0,start+1); //清空临时存储区
-
- swap(buf,start,i);//将交换后的数组还原
- }
- }
- //交换数组元素
- public static void swap(char[] buf,int i,int j)
- {
- char temp=buf[i];
- buf[i]=buf[j];
- buf[j]=temp;
- }
- }
- //按字符串长度排序的比较器
- class StringCmp implements Comparator<String>
- {
- public int compare(String s1,String s2)
- {
- int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));//按照字符串长度排序
- if(num==0)
- num = s1.compareTo(s2);//若长度相同,则按照自然顺序排序
- return num;
- }
- }
复制代码 之前在论坛看到有发这道题的,刚开始觉得如果是固定长度为3的字符串这题也不难,但是如果长度变化的话这个就有点挑战性了,所以我花了不少时间想这题的思路,后来想到这题用递归应该可以解决问题,但是这个输出是一大问题,我就结合了TreeSet按照字母长度进行了排序,这样输出的效果就好多了
|