写了个试试,键盘输入一个字符串,然后返回各种可能。代码如下:
- package com.itheima.demo;
- import java.util.Scanner;
- import java.util.TreeSet;
- public class Demo1 {
- public static void main(String[] args) {
- Scanner s = new Scanner(System.in);
-
- String str = s.next();
- System.out.println(str);
-
- s.close();
- show(str);
-
- }
- /**
- * 打印各种可能
- * @param str str是给定的字符串
- */
- private static void show(String str) {
- TreeSet<String> set = saveInSet(new StringBuilder(str),0,new StringBuilder(),new TreeSet<String>());
- for (String s : set) {
- System.out.println(s);
- }
- }
- /**
- * 返回集合,集合包含字符串所有字符的可能组合
- * @param str 给定字符串转换成的StringBuilder对象,主要是为了操作字符方便
- * @param count 计数,对第count进行排列组合
- * @param buff 暂存放某种可能
- * @param set 集合,去除重复元素,例如"aab"以第一个a开头会有aba,以第二个a开头也会有aba
- * @return 返回TreeSet集合
- */
- private static TreeSet<String> saveInSet(StringBuilder str, int count, StringBuilder buff, TreeSet<String> set) {
- for (int i = 0,len = str.length(); i < len; i++) {
- //获取字符
- char c = str.charAt(i);
- //去掉原字符串的某个字符(保证某个字符不被重复利用)
- str.deleteCharAt(i);
- //缓存添加该字符
- buff.append(c);
- //将该种可能组合存入集合
- set.add(buff.toString());
-
- //str仍包含字符,则递归调用,开始取第二位字符
- //若还有第三位则继续递归……以此类推
- if (str.length() != 0) {
- //count用于记录目前在进行排列组合的第count位
- count++;
- //递归
- saveInSet(str,count,buff,set);
- //第n位递归结束后,需要继续对n-1位排列,位数-1
- count--;
- }
-
- //递归结束后,需要继续对n-1位排列,因此清除第n位的记录
- buff.deleteCharAt(count);
- //删除的字符插回str
- str.insert(i, c);
- }
- //返回集合
- return set;
-
- }
- }
复制代码 |