黑马有一个基础测试题 和这个题目类似
楼主你看看,参考一下。
/**
* 第7题 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符。
* 例如:原始字符串是"abc",打印得到下列所有组合情况:
*"a" "b" "c"
*"ab" "bc" "ca" "ba" "cb" "ac"
*"abc" "acb" "bac" "bca" "cab" "cba"
* @author Administrator
*/
/**
* 思路是 先求字符串的所有组合情况,再把每一种的组合情况的所有排列情况求出
*/
public class Test7 {
public static ArrayList<char[]> list =new ArrayList<char[]>();//保存字符串的所有组合情况
public static ArrayList<String> list2 = new ArrayList<String>();//保存字符串的全字符组合
public static void main(String[] args) {
String str = "abc";
Stack<Character> s = new Stack<Character>();
selectChar(str.toCharArray(),0,str.length(),s);
for(int i = 0;i<list.size();i++){
char[] c = list.get(i);
permutation(c,0,c.length - 1);
}
for(int j = 0;j<list2.size();j++){
System.out.println(list2.get(j));
}
}
/**
* 获得字符串 str 的全部组合情况
* 例如 "abc" ---> "abc" "ab" "a" "ac" "bc" "b" "c"
* 并把全部组合情况保存到 ArrayList list中
* @param str
* @param begin
* @param m
* @param select
*/
public static void selectChar(char[] str,int begin,int m,Stack<Character>select){
if(m == 0){
Object[] Ochars = select.toArray();
char []chars = new char[Ochars.length];
for(int i = 0;i < Ochars.length;i++){
chars[i] = (Character)Ochars[i];
}
list.add(chars);
return;
}
select.push(str[begin]);
selectChar(str,begin + 1,m - 1,select);
select.pop();
selectChar(str,begin + 1 ,m - 1,select);
}
public static void swap(char[]str,int i,int j){
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}
/**
* 求一个字符串的所有排列情况
* @param str
* @param begin
* @param end
*/
public static void permutation(char[] str,int begin,int end){
if(begin == end){
list2.add(new String(str));
return;
}
for(int j=begin;j<=end;j++){
swap(str,begin,j);
permutation(str,begin + 1,end);
swap(str,begin,j);
}
}
}
|