import java.util.ArrayList;
import java.util.Scanner;
/**
* 7、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
* 原始字符串是"abc",打印得到下列所有组合情况:
* "a" "b" "c"
* "ab" "bc" "ca" "ba" "cb" "ac"
* "abc" "acb" "bac" "bca" "cab" "cba"
*/
public class Test7 {
public static void main(String[] args) {
System.out.println("请输入一个字符串:");
String str = new Scanner(System.in).nextLine();
printGroups(str);// 打印字符串的所有组合
}
/**
* printGroups 该函数用于打印所有的字符串组合
* @param str 传入的原始字符串
*/
public static void printGroups(String str) {
char[] chs = str.toCharArray();//原始字符串转化为数组
ArrayList<String> list = new ArrayList<String>();//存储所有的组合
for (char ch : chs)
list.add("" + ch);//向集合list添加所有的长度为1的字符串组合
ArrayList<String> tempList = null;
//第1次循环,实现向集合list添加所有长度为2的组合,
//第2次循环,实现向集合list添加所有长度为3的组合,....
//第(n-1)次循环,实现向集合list添加所有长度为n的组合。
for (int k = 0; k < chs.length; k++) {
tempList = select(list, k + 1);// 过滤出长度为 (k+1)的字符串
getTempGroup(chs, tempList, list);// 获取长度为(k+2)的字符串组合,并存入集合
}
// 遍历集合输出所有的组合
for (String s : list)
System.out.println(s);
System.out.println("组合的总个数为: " + list.size());
}
/**
* getTempGroup 在第k次循环时,获取所有长度为(k+1)的组合,并添加到list集合
* @param chs 输入字符串对应的字符数组
* @param tempList 第k次循环时,存储的是长度为(k+1)的所有字符串组合
* @param list 存储所有的字符串组合
*
* 基本思路:获取n个不重复字符的所有排列组合:
* 1 获取n个不重复的字符
* 2 获取所有的长度为(n-1)的组合
* 3 依次将单个字符与所有长度为(n-1)的字符串拼接,即可得到长度为n的所有组合
*/
private static void getTempGroup(char[] chs, ArrayList<String> tempList,
ArrayList<String> list) {
int n = tempList.size();
for (int i = 0; i < chs.length; i++) {
for (int j = 0; j < n; j++) {
if (!tempList.get(j).contains("" + chs[i])) {// 字母没有重复
list.add("" + chs[i] + tempList.get(j));
}
}
}
}
/**
*
* @param list 需要被过滤的集合
* @param i 希望过滤出的字符串的长度
* @return as 返回存储所有长度为i的字符串的集合
*/
private static ArrayList<String> select(ArrayList<String> list, int i) {
ArrayList<String> as = new ArrayList<String>();
for (String s : list) {
if (s.length() == i)
as.add(s);
}
return as;
}
}
java练习: 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
最新推荐文章于 2022-09-02 16:24:21 发布