回溯算法

KMP算法

℡╲_俬逩灬. 提交于 2019-12-27 00:02:17
KMP算法 在介绍KMP算法之前,先介绍一下BF算法。 一.BF算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。 举例说明: S: ababcababa P: ababa   BF算法匹配的步骤如下 i=0 i=1 i=2 i=3 i=4 第一趟: a babcababa 第二趟:a b abcababa 第三趟:ab a bcababa 第四趟:aba b cababa 第五趟:abab c ababa a ba ba a b aba ab a ba aba b a abab a j=0 j=1 j=2 j=3 j=4(i和j回溯) i=1 i=2 i=3 i=4 i=3 第六趟:a b abcababa 第七趟:ab a bcababa 第八趟:aba b cababa 第九趟:abab c ababa 第十趟:aba b cababa a baba a baba a b aba ab a ba a baba j=0 j=0 j=1 j=2(i和j回溯) j=0 i=4 i=5 i=6 i=7 i=8 第十一趟:abab c ababa 第十二趟:ababc a baba 第十三趟

LeetCode题解--回溯算法(四)

可紊 提交于 2019-12-18 06:09:57
文章目录 131. 分割回文串 回溯算法 37. 解数独 回溯算法 51. N皇后 回溯算法 131. 分割回文串 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“a”,“b”] ] 回溯算法 class Solution { private boolean checkPalindrome ( String s , int begin , int end ) { while ( begin < end ) { if ( s . charAt ( begin ++ ) != s . charAt ( end -- ) ) { return false ; } } return true ; } private void backtracking ( String s , List < List < String > > result , List < String > temp ) { if ( s . length ( ) == 0 ) { result . add ( new ArrayList < > ( temp ) ) ; return ; } for ( int i = 0 ; i < s . length ( ) ; ++ i ) { if (

JAVA实现一个迷宫回溯算法-(回溯方法实现)

僤鯓⒐⒋嵵緔 提交于 2019-12-17 00:09:59
回溯的特点 可以用作与不可预测的操作步骤次数但是步骤模式是一样的就是可以使用回溯方法 一个字符匹配组合算法代码 public static void stringCombinationVersion2 ( ArrayList < ArrayList < String > > resultList , String [ ] macthingArr , Stack < Integer > indexStack ) { //判断索引栈是否为空 if ( indexStack == null ) { indexStack = new Stack < > ( ) ; } //遍历各个回调方法中的字符数组 for ( int index = 0 ; index < macthingArr . length ; index ++ ) { //判断当前回调中的循环索引是否在其它回调函数层中包含 if ( indexStack . contains ( index ) ) continue ; //如果没包含就将当前回调方法中的索引存入到索引栈中 indexStack . push ( index ) ; //判断当前回调函数层数是否在最后一层 if ( indexStack . size ( ) >= macthingArr . length ) { //代表的当前回调方法层最后一层

算法第五章作业

大憨熊 提交于 2019-12-16 10:17:00
1、对回溯算法的理解:   回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。   用回溯算法解决问题的一般步骤: 1) 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。 2 )确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。 3 )以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。 2、请说明“子集和”问题的解空间结构和约束函数   解空间结构:正整数集合S={x1,x2,…,xn}对应的的一个子集S1,S1中的元素之和为c。    约束函数:即剪枝,如果当前结点后所得的值大于c,则表示接下来的搜索不可能找到等于c的答案,直接剪去,再回溯到上一个节点。 3、请说明在本章学习过程中遇到的问题及结对编程的情况   虽然书上有子集树和排列树的模板可用,但是还是实践太少,第一题0/1背包头疼了大半节课,最后还是没办法跳过了直接做第二题QAQ,接下来要完成大作业和复习冲冲冲! 来源: https://www.cnblogs.com/yyxbokewang/p/12041523.html

leetcode 回溯题目 golang语言

纵饮孤独 提交于 2019-12-15 23:56:33
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 “回溯” 返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为 “回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。 回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。 链接:https://leetcode-cn.com/tag/backtracking/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 本文主要总结一下回溯算法的一些题目。语言主要是Golang。 78.子集,不含重复元素 第一种是比较常规的回溯解法。 func subsets(nums []int) [][]int { result := make([][]int, 0) subsetsBT(&result, nums, []int{}, 0) return result } func subsetsBT(result *[][]int, nums []int, temp []int, start int) { //此处深拷贝temp

Eight queens经典回溯算法

本秂侑毒 提交于 2019-12-11 14:39:49
def conflict(state, nextX): print('state:',state) nextY = len(state) for i in range(nextY): print("i=",i) if abs(state[i]-nextX) in (0, nextY-i): print('confict') return True return False def queens(num=8, state=()): for position in range(num): print('***') print('pos:',position) if not conflict(state, position): if len(state) == num-1: print('back to 1st_space_____________position:',position) yield (position,) else: print('Into 2nd_space__________recursive') for result in queens(num, state + (position,)): print('membersihip position:',position) print('membership result:',result) yield

leetcode回溯算法--基础难度

可紊 提交于 2019-12-10 22:58:15
都是直接dfs,算是巩固一下 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 思路 一直搜索,到终点判断是否已经出现,未出现则加入集合 代码 class Solution { set<string>s; map<char,string>m; public: void dfs(string d, string cur, int step){ if(step>d.size()){ return; } if(step==d.size()){ if(s.count(cur)>0){ return; }else{ s.insert(cur); } } string tmp=m[d[step]]; for(int i=0;i<tmp.size();++i){ dfs(d,cur+tmp[i],step+1); } } vector<string> letterCombinations(string digits) { m.insert(make_pair('2',"abc")); m.insert(make_pair('3',"def")); m.insert(make_pair('4',"ghi")); m.insert(make_pair('5',"jkl")); m

剑指offer 字符串的排列

霸气de小男生 提交于 2019-12-10 10:45:20
这是一道全排列的问题,具体的步骤百度可以找到很多。 算法思想是依次固定每一个字符然后对字串进行相同的操作即可 注意:这里的固定其实就是交换的意思,每次从begin位置开始依次往后交换str[begin] 与 str[i] 我觉的这是 动态规划 + 回溯 的算法题 最后想吐槽以下牛客的这个判题系统有点..... 来源: https://www.cnblogs.com/jiguang321/p/12014967.html

递归

只谈情不闲聊 提交于 2019-12-10 03:22:36
递归应用场景 看个实际应用场景,迷宫问题(回溯),递归(Recursion) 递归的概念 简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂问题,同时可以让代码变得简洁。 递归的调用机制 1. 打印问题 /** * 打印问题 * @param n */ public static void test ( int n ) { if ( n > 2 ) { test ( n - 1 ) ; } System . out . println ( "n=" + n ) ; } 测试 public static void main ( String [ ] args ) { //通过打印问题,回顾递归调用机制 test ( 4 ) ; 2. 阶乘问题 /** * 阶乘问题 */ public static int factoriial ( int n ) { if ( n = = 1 ) { return 1 ; } else { return factoriial ( n - 1 ) * n ; } } 测试 public static void main ( String [ ] args ) { //通过打印问题,回顾递归调用机制 //test(4); //通过阶乘问题,回顾递归调用机制 int res = factoriial ( 2 ) ;

DFS深度优先算法学习

佐手、 提交于 2019-12-04 14:25:58
刚开始学习算法,参考大佬博客还是有很多不明白的,于是一步步解析,写下笔记记录。 大佬博客地址: https://blog.csdn.net/fuzekun/article/details/85220468 问题描述   n个人参加某项特殊考试。   为了公平,要求任何两个认识的人不能分在同一个考场。   求是少需要分几个考场才能满足条件。 输入格式   第一行,一个整数n(1<n<100),表示参加考试的人数。   第二行,一个整数m,表示接下来有m行数据   以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n) 表示第a个人与第b个人认识。 输出格式   一行一个整数,表示最少分几个考场。 样例输入 5 8 1 2 1 3 1 4 2 3 2 4 2 5 3 4 4 5 样例输出 4 样例输入 5 10 1 2 1 3 1 4 1 5 2 3 2 4 2 5 3 4 3 5 4 5 样例输出 5 因为数据量很小可以使用回溯算法。 应用两层回溯: 第一层回溯是将考生放在不同考场里面产生的效果,比如学生3号可以放在教室1和教室2中那么放在那一个教室会产生更好的效果这是一层回溯。 第二层回溯是考生放入以前的考场还是考生自己重新用一个考场。比如考生3号可以放进教室1和教室2,也可以放进教室3。 应用简单的剪枝技巧: