分治回溯-分治的应用-全排列问题
大致思路:
将一个大的全排列分成小的排列,直到元素为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;}
}
分治回溯-分治的应用-全排列问题相关推荐
- 数据结构与算法学习④(哈夫曼树 图 分治回溯和递归)
数据结构与算法学习④(哈夫曼树 图 回溯和递归 数据结构与算法学习④ 1.哈夫曼树 1.1.相关概念 1.2.哈夫曼树的构建 1.3.哈夫曼编码 1.4.面试题 2.图 2.1.图的相关概念 2.2. ...
- 分治回溯算法----八皇后问题
八皇后问题:在一个8×8的棋盘中,放入8个皇后棋子,要求同行同列同斜线不能有重复的皇后棋子,八皇后问题一共有92种解法.如图所示:即八皇后问题的一个解. //分治回溯算法解决八皇后问题 public ...
- 点分治+CDQ分治+整体二分全纪录
点分治 点分治讲解 解决树上路径问题 经典例题:点分治(长度小于m的路径计数) 经典例题:点分治(聪聪可可) 经典例题:点分治(多个定值路径计数) 经典例题:点分治(采药) 经典例题:点分治+ST表+ ...
- CDQ分治【分治(真得头疼)
前言: 说实话我对于这种没有固定板子,变化多端的算法实在是非常头疼的 但是不学不行,这也是一种很重要的思伟方式 所以趁着这几天的心情比较好(快要放大周),赶紧学一波~ 鸣谢:tham,stdcall ...
- 动态规划从理论到实践-深入理解贪心/分治/回溯/动态规划的算法思想
摘要:本文主要讲解常见的四种算法,分别为贪心算法:第一步选择最优的走法,算法不能做到全局最优:分治算法:一种处理问题的思想,使用递归来实现:回溯算法:我们枚举所有的解,找到满足期望的解,可以把求解过程 ...
- 算法思想之递归分治回溯
参考文档 递归思想 思想 描述 递归 当需要重复地多次计算相同的问题,通常可以采用递归或循环.递归是在一个函数内部调用这个函数自身. 递归的本质是把一个问题分解成两个或多个小问题.(注:当多个小问题存 ...
- 二叉树的深度 | 分治 +回溯 + 迭代
二叉树的最大深度 leetcode https://leetcode.cn/problems/maximum-depth-of-binary-tree/ 回溯基本思路 二叉树的最大深度就是 : 从根节 ...
- LeetCode刷题---递归回溯分治【2020第一版】
# 诗经·秦风·无衣 岂曰无衣,与子同袍.王于兴师,修我戈矛.与子同仇. 岂曰无衣,与子同泽.王于兴师,修我矛戟.与子谐作. 岂曰无衣,与子同裳.王于兴师,修我甲兵.与子谐行. #把正确的时间拿来看看 ...
- bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治
这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...
- POJ1741 Tree(树分治——点分治)题解
题意:给一棵树,问你最多能找到几个组合(u,v),使得两点距离不超过k. 思路:点分治,复杂度O(nlogn*logn).看了半天还是有点模糊. 显然,所有满足要求的组合,连接这两个点,他们必然经过他 ...
最新文章
- 【转】结合ashx来在DataGrid中显示从数据库中读出的图片
- register_chrdev_region源码理解
- 一图弄清滴答定时器寄存器 SysTick Registers
- 电脑遇到脱机状态怎么解除?
- 【RLchina第二讲】 Foundations of Reinforcement Learning
- qt设置背景图片变黑色_PS软件如何快速制作一个黑色创意海报
- pe安装linux 12.04,乌班图系统Ubuntu 12.04安装教程(图文详解)
- 谷歌地球尝试验证时检测到错误_验证码为何越来越难了?
- scanf 详解 - 你所不知道的scanf用法
- vsphere esxi原生下载方式
- php贴吧系统,PhpSay 开源贴吧系统 v2.1
- FASTA序列格式说明
- Ubuntu16.04编译roc-rk3328-cc
- 篱笆家装宝典之六——地板板材
- “希希敬敬对”队软件工程第九次作业-beta冲刺第二次随笔
- codevs[3145]汉诺塔游戏
- 安装冒险岛出现计算机丢失文件夹,冒险岛老更新失败?
- 什么是POP3、SMTP及IMAP?POP3与IMAP的区别
- scp传文件 文件名有空格解决方法
- 2台window电脑如何传输文件
热门文章
- 机器学习7-主成分分析
- 海量高维数据与纬度约减
- 简单类型视图状态应用
- 6.2GPT意境级讲解
- 伪标记是一种简单的半监督学习方法
- byte 类型_Go 语言string 也是引用类型
- 蓝桥杯2015年第六届C/C++A组国赛第四题-穿越雷区
- 蓝桥杯2019年第十届C/C++省赛B组第一题-组队
- Vue 中使用element ui 自定义邮箱和手机号的效验规则
- Eclipse(ADT)找不到android.support.v4.view.ViewPager,2步搞定!