java练习: 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
2015-09-24 12:37
555 查看
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; } }
相关文章推荐
- String的存储 -- java
- checkbox全选和取消全选
- 统计英文单词词频
- java学习笔记反射机制
- java拾遗------面向对象知识
- java调用TD的COM组件OTAClient80.dll实现从TD中取数
- java多线程(三)
- java多线程(二)
- Java多线程(一)
- 关于Launcher2导入Eclipse的问题
- 浅析JAVA中过滤器、监听器、拦截器的区别
- Java 泛型总结与应用
- Java中HashMap的实现机制
- java远程发送文件到服务器(jcifs.smb实现方式)
- java泛型
- 在eclipse导入Java的jar包的方法JDBC(图文说明)
- maven缺少jdk-tools解决方法
- java中按钮控制重绘面板
- Java进阶:细说引用类型
- Eclipse开发项目,自动添加注释的使用