深度优先搜索实现:
public class DFS {
public static int [] arr = {1,2,3,4,5,6,7,8,9};
public static int [] visited = {0,0,0,0,0,0,0,0,0};
public static char [] ch =new char[9];
static void dfs1(int n){//数字的全排列 伪全排列
if(n==9){
System.out.println(Arrays.toString(arr));
}
for(int i=0;i<=9;i++){//所有卡片的值
if(visited[i]==0){//卡片没有用过
visited[i]=1;//设置用过了
arr[n]=i;
dfs1(n+1);
visited[i]=0;
}
}
}
static void dfs2(int n){//字符串的全排列 伪全排列
if(n==9){
String str = new String(ch);
System.out.println(str);
}
for(char i='a';i<='i';i++){
if(visited[i-97]==0){
visited[i-97]=1;
ch[n]=i;
dfs2(n+1);
visited[i-97]=0;
}
}
}
}
递归实现:交换的思想!!!
主要思想:
每一个字符可以和它后面的字符进行交换(可以和自己交换)
例如 字符串abc交换第一个字符得到->abc,bac,cba 。
接着交换第二个字符
abc->abc,acb
bac->bac,bca
cba->cba, cab
得到字符串的全排列
把大的问题划分为小问题,刚好符合递归的思想
public class 字符串的递归全排列 {
public static void DFS(char[]str,int i){//i是交换的字符位置
if(i==str.length){//交换到最后一个了 进行输出
System.out.println(new String(str));
}
for(int j=i;j<=str.length-1;j++){//每一个字符可以跟后面的字符进行交换
swap(str,i,j);//把第i个字符和第j个进行交换
DFS(str,i+1);//交换i+1个字符
swap(str,i,j);//换回来
}
}
static void swap(char[] str, int i, int j) {
char a = str[i];
str[i] = str[j];
str[j] = a;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.next();
DFS(str.toCharArray(),0);
}
}