深度优先搜索实现:根据位置放数字
- 代码实现思路:
- 现有num数组,实现num数组元素的全排列
- 定义函数dfs(int [] num,int pos) //pos表示正在遍历的位置
- 定义标记数组visit,确保不在重复访问某个元素
- 定义接受结果数组 temp
- dfs(int []num,int pos){
if(pos==num.length){
输出temp数组
}
for(int i=0;i<num.length;i++){//遍历数组元素
if(!visit[!])//如果没有当前元素没有被访问过
{
temp[pos]=num[i];//把当前值赋给pos位置
visit[i]=true;//访问标记
dfs(num,pos+1);//放置下一个位置
visit[i]=false;
}
}
}
递归实现:交换的思想!!!
主要思想:
每一个字符可以和它后面的字符进行交换(可以和自己交换)
例如 字符串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);
}
}