- import java.util.*;
- /*7、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
- 原始字符串是"abc",打印得到下列所有组合情况:
- "a" "b" "c"
- "ab" "bc" "ca" "ba" "cb" "ac"
- "abc" "acb" "bac" "bca" "cab" "cba"*/
- public class Test7 {
- static int count = 1;
- public static void main(String[] args) {
- //选定一个字符串传入组合方法中
- String str = "abcddgdse";
- group(str);
-
- }
- private static void group(String str) {
- // TODO Auto-generated method stub
- //创建一个集合并且将字符串中的字符串变为子串然后存入集合中
- List<String> list = new ArrayList<String>();
- char[] chs = str.toCharArray();
- for(int i = 0;i<chs.length;i++){
- list.add(chs[i]+"");
- }
- //将只有两个字母的形式单独拿出来因为此时变量定义内循环初始变量为0
- int length = str.length();
- for(int x = 0;x<length;x++){
- for(int y = 0;y<length;y++){
- //判定元素之间是否有包含关系
- if(!list.get(y).contains(list.get(x)))
- //将不相同的元素相加得到新元素自动装拆箱
- list.add(list.get(x)+list.get(y));
- }
-
- }
- //定义集合长度和内循环的初始量sum传入方法中
- int num = list.size();
- int sum =length;
- setList(list, length, num,sum);
-
- }
- private static void setList(List<String> list, int length, int num,int sum) {
- //循环得位字母开始就必须是一位字母和上一次获得的字母相加 而不跟以前的相加
- for(int x = 0;x<length;x++){
- for(int y = sum;y<num;y++){
- //判定元素之间是否有包含关系
- if(!list.get(y).contains(list.get(x)))
- //将不相同的元素相加得到新元素自动装拆箱
- list.add(list.get(x)+list.get(y));
- }
- }
- num = list.size();
- //递归结束标记定义
- if(count<length-2){
- //运用数字排列组合的思想得到sum然后递归
- sum=sum*(sum-count)+length;
-
- count++;
- setList(list,length,num,sum);
- }
- //最后递归完成,循环便利获取元素内容
- else{
-
- for(String s : list){
- System.out.println(s);
- }
- }
- }
- }
-
-
-
复制代码
超过4个字母以上都只出来4个字母从1个到4个的全排列,没有一个5个的 求大神帮助 |