分治回溯-分治的应用-全排列问题

在这里插入图片描述

大致思路:
将一个大的全排列分成小的排列,直到元素为1个时,就结束排列
就是比如字符串:“ABC”每个元素当一次老大,最为一个大的排列
第一次A与自己交换A当老大
第二次A与B进行交换B当老大
第三次A与C进行交换C当老大
从图中可以看出当我们交换一次之后,下一轮交换是从最初始的顺序进行交换,所以每次交换后就需要将我们的字符串进行一下还原
在这里插入图片描述

当第一轮每个都当一次老大后,就是每个老大剩下的元素再向下进行交换当老大,看图
在这里插入图片描述
最后的话,只剩一个就不能再往下划分排列,所以结束排列,得到排列结果
在这里插入图片描述
代码采用递归的形势所写,如下

package com.sj.分治回溯;

import java.util.HashSet;

//全排列
public class FullPermutation {

	public static void main(String[] args) {
	String s="ABC";
     HashSet<String> set=new HashSet<>();
     permutation(set,0,s.length()-1,s.toCharArray());//toCharArray(),就是将字符串转为字符数组
     System.out.println(set);
	}

	private static void permutation(HashSet<String> set, int from, int to, char[] arr) {
		//解决在数组arr中from到to之间的元素轮流当当前的老大 确定一个排列之后加入到set中
		if(from==to) {
			set.add(new String(arr));
		}else {
			for(int i=from;i<=to;i++) {
				
				swap(arr,i,from);
				//分治的第二次排列
				permutation(set,from+1,to,arr);
				//对字符串进行还原操作,以便后续排列
				swap(arr,i,from);
			}
		}
	}

	private static void swap(char[] arr, int i, int from) {
		char temp=arr[i];
		arr[i]=arr[from];
		arr[from]=temp;
		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个F啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值