- public class Test8 {
- public static void main(String[] args)
- {
- //建立需要排列的字符串
- String str = "abc";
-
- //建立一个集合用于存储所排列的字符串,因为不要重合的,所以用Set集合
- TreeSet<String> tsSet=new TreeSet<String>();
-
- //将字符串转换为字符数组传入要进行递归的方法中。
- permutation(tsSet,str.toCharArray(),0);
-
- //在递归完成后,集合中已经有了所有的排列,打印。
- System.out.println(tsSet.toString());
- }
-
- public static void permutation(Set<String> s,char[] str, int x) {
- //定义递归的完结条件
- if (x >= str.length)
- return;
- //用于对递归中取到的排列进行存储
- if (x == str.length - 1) {
- s.add(new String(str));
- } else {
- //建立一个循环,进行循环读取
- for (int y = x; y < str.length; y++) {
-
- //在循环到第二次的时候,开始转换首字母,以便递归
- char temp = str[y];
- str[y] = str[x];
- str[x] = temp;
-
- //将变换了首字母的字符数组传入,进行递归,取得与与原字符串相同长度的所有排列
- permutation(s,str, x + 1);
-
- //去掉首字母进行递归,取得长度减一的字符串的所有排列,
- //因为不断递归,所以最终会取到单一的字符为止,如此则取到了所有的排列
- permutation(s,Arrays.copyOfRange(str, 1, str.length),0);
-
- //将字符数组变回原样,保证每次递归时,都会变换首字母(x和y转换)
- temp = str[y];
- str[y] = str[x];
- str[x] = temp;
- }
- }
- }
-
- }
复制代码
编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
[a, ab, abc, ac, acb, b, ba, bac, bc, bca, c, ca, cab, cb, cba]
思考:可以首先将以a开头的所有排列找出,然后在找出以b开头的排列...如此可以用到递归的方法。
|