题目:输入一串字符,求字符的所有排列,例如输入a、b、c,得到的组合是a b c ab ac bc abc
显然ab与ba是相同的。
下面的算法是利用回退的性质来求所有的组合的。
package com.interview;
import java.util.Scanner;
/*
* 实现组合问题:中心思想,对于abcd,实现插入某一个位置的字符
* a 插入0位置字符
* ab 插入1位置字符
* abc 插入2位置字符
* abcd 插入3位置字符(此时已满,回退,这显然用的是栈,那么递归也是可以实现的)
* abd
* ac
* acd
* ad
* b
* bc
* bcd
* bd
* c
* cd
* d
*/
public class Combination {
private void combine(String str) {
char[] in = str.toCharArray();
StringBuffer out = new StringBuffer();
allCombine(in, out, 0);
}
private void allCombine(char[] in, StringBuffer out, int start) {
for (int i = start; i < in.length; i++) {
out.append(in[i]);
System.out.println(out);
if (i < in.length - 1)
allCombine(in, out, i + 1);
out.setLength(out.length() - 1);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Combination cb = new Combination();
Scanner sc = new Scanner(System.in);
String str = sc.next();
cb.combine(str);
}
}