【001】求字符串的所有排列组合

【原题】比如,输入abc,输出abc、acd、bac、bca、cab、cba。

主要的思路:

1、递归,每个字符在每个位置都出现(暂时没有处理重复的字符)

2、在最后的字符组合长度为字符串长度时输出

 1 package com.persia.test;
2
3 import java.util.Scanner;
4
5 public class StringArrangement {
6
7 private int len;
8
9 private char[] getRest(char[] arr,int i) {
10 char[] rs=new char[arr.length-1];
11 for(int j=0;j<i;j++) {
12 rs[j]=arr[j];
13 }
14 for(int j=i+1;j<arr.length;j++) {
15 rs[j-1]=arr[j];
16 }
17 return rs;
18 }
19 private void arrangeString(String pre,char[] arr) {
20 //System.out.println("pre:"+pre);
21 if(pre.length()==len) {
22 System.out.println(pre);
23 }
24 if(arr.length<1)
25 return;
26
27 //System.out.print(pre);
28 for(int i=0;i<arr.length;i++) {
29 char first=arr[i];
30 //System.out.print(first);
31 char[] rest=getRest(arr, i);
32 arrangeString(pre+first,rest);
33 }
34 //System.out.println("");
35 }
36
37 public void getResult(String content) {
38 char[] arr=content.toCharArray();
39 len=arr.length;
40 arrangeString("",arr);
41
42 }
43
44
45 public static void main(String[] args) {
46 Scanner scanner=new Scanner(System.in);
47 System.out.println("please input:\n");
48 String content=scanner.nextLine();
49 StringArrangement sArrangement=new StringArrangement();
50
51 sArrangement.getResult(content);
52
53 }
54
55 }

 

比如输入abcd,输出:

abcd abdc acbd acdb adbc adcb
bacd badc bcad bcda bdac bdca
cabd cadb cbad cbda cdab cdba

dabc dacb dbac dbca dcab dcba

 

【改进】由于每次都需要新的数组来存放剩下的字符,比较浪费空间。改为利用原有的空间,将首位字符与最后一位调换,递归时告诉其长度即可。

private void swap(char[] arr,int i,int j) {
if(i==j)
return;
char tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
private void arrangeString(String pre,char[] arr,int length) {
//System.out.println("pre:"+pre);
if(pre.length()==len) {
System.out.println(pre);
}
if(length<1)
return;

//System.out.print(pre);
for(int i=0;i<length;i++) {
char first=arr[i];
//System.out.print(first);
swap(arr, i, length-1);
arrangeString(pre+first,arr,length-1);
swap(arr, length-1,i);
}
//System.out.println("");
}

public void getResult(String content) {
char[] arr=content.toCharArray();
len=arr.length;
arrangeString("",arr,arr.length);

}

由于前面置换了位置,在进行下一个遍历前,要置换回来。

 

【变体1】输入一个字符串,输出该字符串中字符的所有排列组合。如输入ab,排列组合有a、b、ab、ba。

将上面的代码稍微改下即可:将判断长度输出去掉,每次都输出。

   private void arrangeString(String pre,char[] arr,int length) {
//System.out.println("pre:"+pre);
//if(pre.length()==len) {
System.out.println(pre);
//}
if(length<1)
return;

//System.out.print(pre);
for(int i=0;i<length;i++) {
char first=arr[i];
//System.out.print(first);
swap(arr, i, length-1);
arrangeString(pre+first,arr,length-1);
swap(arr, length-1,i);
}
//System.out.println("");
}



【变体2】输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。

 



posted @ 2011-12-02 23:18 hello_caesar 阅读(174) 评论(0) 编辑 收藏