[算法学习]Java实现字符序列全组合
2016-02-18 14:00
597 查看
问题描述: 假设数组中字符无重复,输入一个字符数组,打印出字符的全部组合。例如:输入{a,b,c}输出a、b、c、ab、ac、bc、abc
解法与分析: 不使用辅助空间。输入一组n个字符的数组,将打印出C(1,n)+…+C(n,n)=2^n个组合。
1.按照从1到n作为一个循环,每次输出C(i,n)个组合。这样,我们只需要处理如何输出一个C(i,n)就可以解决问题。
2.处理C(i,n):i有两种特殊情况,一种是i=1,那么直接输出n个字符中每个字符就可以;一种是i=n,那么整个字符数组一起输出就可以。i>1&&i
附:源码地址
解法与分析: 不使用辅助空间。输入一组n个字符的数组,将打印出C(1,n)+…+C(n,n)=2^n个组合。
1.按照从1到n作为一个循环,每次输出C(i,n)个组合。这样,我们只需要处理如何输出一个C(i,n)就可以解决问题。
2.处理C(i,n):i有两种特殊情况,一种是i=1,那么直接输出n个字符中每个字符就可以;一种是i=n,那么整个字符数组一起输出就可以。i>1&&i
参考代码如下
[code]/** * 从C(1,n)计算到C(n,n),时间复杂度是C(1,n)+...+C(n,n)=O(2^n) * 应该有不用递归的更优解法吧,但是我一时也想不过来,只能用递归来解。 * @param cs */ public static void printAllSeqCombination(char[] cs) { if (cs == null || cs.length == 0) return; for (int i = 1; i <= cs.length; i++) { printAllSeqCombination(cs, 0, cs.length - 1, 0, i - 1); } } /** * * @param cs * @param array_start 能被组合的数组元素开始第一个元素 * @param array_end 能被组合的数组元素最后一个元素 * @param print_start 要被打印出来的第一个index * @param print_end 要被打印出来的最后一个一个index */ private static void printAllSeqCombination(char[] cs, int array_start,int array_end, int print_start, int print_end) { if (print_end == array_end) { System.out.println(new String(cs, print_start, print_end- print_start + 1)); return; } if (array_start == print_end) { for (int i = array_start; i <= array_end; i++) { exch(cs, array_start, i); System.out.println(new String(cs, print_start, print_end- print_start + 1)); exch(cs, array_start, i); } return; } while (print_end<=array_end) { printAllSeqCombination(cs, ++array_start, array_end, print_start++, print_end++); } } /** * * @Description: 交换数组中两个数的值 * @param @param cs * @param @param i * @param @param j * @return void * @throws */ private static void exch(char[] cs, int i, int j) { if (i == j) return; char temp = cs[i]; cs[i] = cs[j]; cs[j] = temp; }
附:源码地址
相关文章推荐
- 深入Java集合学习系列:HashMap的实现原理
- Spring学习笔记(18)----使用Spring配置文件实现事务管理
- Java生成验证码
- Spring管理事务默认回滚的异常是什么?
- Java线程(十):CAS
- Java中通过UDP协议发送和接受数据
- Java中通过UDP协议发送和接受数据
- java判断字符串包含某个字符段
- Java开发中的23种设计模式详解(转)
- Java线程(九):Condition-线程通信更高效的方式
- 2、修改MyEclipse中生成的模板servlet的方法
- Java线程(八):锁对象Lock-同步问题更完美的处理方式
- eclipse 使用mvn模块化开发
- Java对象的强、软、弱和虚引用
- java 排序算法
- Java并发编程:volatile关键字解析(转)
- 基于Struts2的验证码程序
- Java 反射
- Java线程(七):Callable和Future
- Java线程(六):线程池