要求:
輸入一個字符串,去掉重複元素後,把所有字符串排列情況打印出來
如輸入abcc ,則打印:abc,acb,bac,bca,cab,cba
代碼(用深度優先搜索實現):
import java.util.Scanner;
public class Main {
static int []visit;//標記數組
static char [] result;//打印結果數組
static int n;//元素個數
static char[] arr;//需全排列的素組
static int first;//標記是否是第一種情況,以便不打印第一個逗號
static void dfs(int depth){
//訪問了數組中所有的字符,打印出結果
if(depth==n){
if(first!=0){
System.out.print(",");
}
for(int i=0;i<n;i++){
System.out.print(result[i]);
}
first++;
}
//對每個位置深搜賦值
else{
for(int i=0;i<n;i++){
//visit[i]==0表示arr[i]這個字符沒被訪問過
if(visit[i]==0){
//賦值到depth這個位置
result[depth]= arr[i];
//標記i這個位置的元素被訪問過,不能再用它
visit[i]=1;
//深搜下一個位置
dfs(depth+1);
//回溯到前一個位置,讓它處於未訪問過狀態
visit[i]=0;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
String str=scanner.next();
char []input=str.toCharArray();
n=0;
first=0;
int len=input.length;
//arr表示去掉重複字符後的數組
arr=new char[len];
//去掉重複字符
for(int k=0;k<len;k++){
boolean repeat=false;
for(int m=0;m<n;m++){
if(input[k]==arr[m])
{
repeat=true;
break;
}
}
if(!repeat)
arr[n++]=input[k];
}
//創建標記數組
visit=new int[n];
//創建要打印的結果數組
result=new char[n];
//進行深度優先搜索遍歷打印全排列
dfs(0);
}
}