这是我借鉴论坛一位同学写的代码,希望有用,代码插入功能是<>图标那个
- import java.util.*;
- import java.io.*;
- public class Test5
- {
- public static int count = 0;
- public static void main(String[] args)throws IOException
- {
- //新建一个TreeSet用于存储排列后的组合,并提供一个自定义的比较器
- TreeSet<String> set = new TreeSet<String>(new MyComp());
-
- //接收键盘输入的字符串
- String line = new Scanner(System.in).nextLine();
-
- //调用函数
- getDiff("",line,set);
-
- //遍历集合,输出元素
- Iterator<String> it = set.iterator();
- int i = 1;
- while(it.hasNext())
- {
- String s = it.next();
-
- //换行
- if(s.length() > i)
- {
- System.out.println();
- i++;
- }
-
- //按格式输出元素
- System.out.print("\""+s+"\"");
-
- }
- }
-
- /*
- * 整体的思维方式是,将串分成两部分,一部分为前缀,即 不需要修改的,另外一部分是剩下的串,
- * 如果剩下的串的长度为1,那么构成规则便只有一种,就是前缀+剩下的长度为1的串,存入TreeSet中,之所以使用TreeSet是因为可以过滤掉重复的元素,而且可以通过重写比较器进行排序.
- * 否则,便可以将剩下的串进行再次分割,将剩下的串的每一位拼接到前缀,递归寻找结果,并将结果存入TreeSet中.
- * @param prefix 字符串的构成前缀
- * @param strRight 剩下的字符串
- */
- private static void getDiff(String prefix,String strRight,TreeSet<String> set)
- {
- //如果字符串的长度为1,直接添加进set中
- if(strRight.length()==1)
- {
-
- if(!(set.contains(prefix+strRight)))
- set.add(prefix+strRight);
- count++;
- return;
- }
-
- //通过递归寻找结果
- for(int i=0;i<strRight.length();i++)
- {
- StringBuilder sb = new StringBuilder(strRight);
- String str = prefix+strRight.substring(i, i+1);
- if(!(set.contains(str)))
- set.add(str);
- count++;
- getDiff(str,sb.deleteCharAt(i).toString(),set);
- }
- }
-
- }
- //自定义比较器进行排序
- class MyComp implements Comparator
- {
- public int compare(Object o1,Object o2)
- {
- String str1 = (String)o1;
- String str2 = (String)o2;
- int num = str1.length()-str2.length();
- if(num == 0)
- return str1.compareTo(str2);
- return num;
- }
- }
复制代码 |