全排列的递归实现和DFS(深度搜索实现)

深度优先搜索实现:根据位置放数字

全排列的递归实现和DFS(深度搜索实现)_第1张图片

  • 代码实现思路:
  • 现有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);
	}
	}

你可能感兴趣的:(算法)