要求:
输入一个字符串,去掉重复元素后,把所有字符串排列情况打印出来
如输入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);
}
}