- package com.itheima;
- /**
- * 5、 编程列出一个字符串的全字符组合情况,原始字符串中没
- 有重复字符,例如:
- 原始字符串是"abc",打印得到下列所有组合情况:
- "a" "b" "c"
- "ab" "bc" "ca" "ba" "cb" "ac"
- "abc" "acb" "bac" "bca" "cab" "cba"
-
- * @author shenli
- *分析:
- *发现二排的字符由第一排排组合而成,而第三排的字符由第一排与第二排排列组合而成
- *而第一排字符是由原字符串分解成字符形成,而字符串长度正好跟打印行数一致
- *所以,可以建立一个函数,将第一排的数据传进去然后返回第二排数据
- *再由第一排数据与第二排数据得到第三排数据,
- *再由第一排数据与第三排数据得到第四排数据(如果字符串够长的话)
- *由此可以利用递归函数的特点,再由字符串长度来控制递归次数
- *思路:
- *1. 将源字符串转换成字符数组,为了使它能够方便运用,转成字符串数组
- *2. 因为每一行的元素个数不确定,需要一个长度可变的容器来装数据,使用List集合
- *3. 因为要使用递归,而生成第n行需要第n-1行的数据与第一行的数据,并且字符串长度控制递归次数
- * 因此, 函数要有三个参数, 第一行的数据,n-1行的数据,与字符串长度
- */
- import java.util.*;
- public class Test5 {
- public static void main(String[] args) {
- // 建立一个字符串,并最终将其转换成字符类型数组strs
- String str = "abc";
- String[] strs = null;
- //用于转换字符串为字符串数组的函数
- strs = strToStrs(str);
- //打印字符串数组
- for(String s : strs)
- {
- System.out.print(s+" ");
- }
- System.out.println();
- //因生成规律为两个字符串数组生成下一个字符串数组
- //并由字符串长度控制循环次数,要传递三个参数
- //第二行的数据是有第一行与自己排列组合得到,因此应传两个strs
- tran(strs,strs,strs.length);
-
- }
- //用于转换字符串str到字符串数组 例如 ”abc“-->”a“ ”b“ ”c“
- public static String[] strToStrs(String str)
- {
- char[] orichs = str.toCharArray();
- int len = orichs.length;
- String[] oristrs = new String[len];
- for(int x = 0 ; x<len ; x++)
- {
- oristrs[x] = orichs[x]+"";
- }
- return oristrs;
- }
- //用于根据规则打印每一行的数据
- //ori表示第一行的原字符串生成的数组,nstr表示当前行数组,num用于控制循环的记号
- public static String[] tran(String[] ori,String[] nstr, int num)
- {
- //num(原字符串长度)用来控制打印行数,因第一行在外打印,所以从num-1开始
- if(--num>0)
- {
- //用List集合来存储所产生的下一行数据
- List<String> list = new ArrayList<String>();
- //嵌套循环来组合原字符串数组与当前行数组来生成下一行数组
- for(int x = 0;x<ori.length;x++)
- {
- for(int y = 0 ;y<nstr.length;y++)
- {
- //原字符数组与当前行数组组合时应避免重复元素
- if(!nstr[y].contains(ori[x]))
- {
- //将生成的下一行数据存储到list中
- list.add(ori[x]+nstr[y]);
- //打印生成的数据
- System.out.print(ori[x]+nstr[y]+" ");
- }
- }
- }
- //每行数据打印完换行
- System.out.println();
- //当条件未结束时要继续打印下一行
- return tran(ori,list.toArray(new String[0]),num);
- }
- //打印完毕,结束函数
- return null;
- }
- }
复制代码 |