131:分割回文串

链接:131. 分割回文串 - 力扣(LeetCode)

for 遍历字符串

递归切割,切割到字符串尾,单次结束

 1 class Solution:
2 def partition(self, s: str) -> List[List[str]]:
3 if(not s): return []
4 re=[]
5 self.backtracking(s,[],re,0)
6 return re
7 def backtracking(self,s,path,re,index):
8 if(index==len(s)):
9 re.append(path[:])
10 return
11 for i in range(index,len(s)):
12 strs=s[index:i+1]
13 if(self.bool_hui(strs)):
14 path.append(strs)
15 self.backtracking(s,path,re,i+1)
16 path.pop()
17 else: continue
18 def bool_hui(self,s):
19 if not s: return False
20 lens=len(s)
21 for i in range(lens//2):
22 if(s[i]!=s[lens-i-1]): return False
23 return True

partition

优化判断字符串是否为回文串:

s[index:i+1]==s[index:i+1][::-1]

all函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False

all(s[i] == s[len(s) - 1 - i] for i in range(len(s) // 2))

93:复原IP地址

链接:93. 复原 IP 地址 - 力扣(LeetCode)

结束条件:每一段IP中.的数量为4时,判断IP长度是否比s长度大4

 1 class Solution:
2 def restoreIpAddresses(self, s: str) -> List[str]:
3 if(not s): return []
4 re=[]
5 self.backtracking(s,"",re,0)
6 return re
7 def backtracking(self,s,path,re,index):
8 if(path.count(".")==4):
9 if(len(path)==len(s)+4):
10 re.append(path[:len(path)-1])
11 return
12 for i in range(index,len(s)):
13 strIp=s[index:i+1]
14 if(not self.isvalue(strIp)): return
15 self.backtracking(s,path+strIp+'.',re,i+1)
16 def isvalue(self,strs):
17 if(int(strs)>255): return False
18 if(strs[0]=='0' and len(strs)>1): return False
19 return True
20
21
22
23

restoreIpAddresses

78:子集

链接:78. 子集 - 力扣(LeetCode)

结束条件:index=len(nums),path每append一次,都要放入结果集中,不能再结束时再放

 1 class Solution:
2 def subsets(self, nums: List[int]) -> List[List[int]]:
3 if(not nums): return nums
4 re=[[]]
5 self.backtracking(re,[],nums,0)
6 return re
7 def backtracking(self,re,path,nums,index):
8 if(index==len(nums)):
9 return
10 for i in range(index,len(nums)):
11 path.append(nums[i])
12 self.backtracking(re,path,nums,i+1)
13 re.append(path[:])
14 path.pop()

subsets

90:子集II

链接:90. 子集 II - 力扣(LeetCode)

数组先排序,排序后,如果i大于index,并且和前一个相等,跳过

 1 class Solution:
2 def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
3 if(not nums): return nums
4 re=[[]]
5 nums.sort()
6 self.backtracking(nums,re,[],0)
7 return re
8 def backtracking(self,nums,re,path,index):
9 if(index==len(nums)): return
10 for i in range(index,len(nums)):
11 if(i>index and nums[i]==nums[i-1]): continue
12 path.append(nums[i])
13 self.backtracking(nums,re,path,i+1)
14 re.append(path[:])
15 path.pop()

subsetsWithDup

491:非递减子集

链接:491. 非递减子序列 - 力扣(LeetCode)

em....再来一个试试

 1 class Solution:
2 def findSubsequences(self, nums: List[int]) -> List[List[int]]:
3 if(len(nums)<2): return []
4 re=[]
5 self.backtracking(nums,[],re,0)
6 return re
7 def backtracking(self,nums,path,re,index):
8 #长度为大于2,就放入结果集中
9 if(len(path)>1): re.append(path[:])
10 #记录当前层哪些元素被用过
11 uset=set()
12 for i in range(index,len(nums)):
13 if((path and path[-1]>nums[i]) or nums[i] in uset): continue
14 uset.add(nums[i])
15 path.append(nums[i])
16 self.backtracking(nums,path,re,i+1)
17 path.pop()

findSubsequences

46:全排列

链接:46. 全排列 - 力扣(LeetCode)

for从头开始

 1 class Solution:
2 def permute(self, nums: List[int]) -> List[List[int]]:
3 if(not nums): return []
4 re=[]
5 self.backtracking(nums,[],re)
6 return re
7 def backtracking(self,nums,path,re):
8 if(len(path)==len(nums)):
9 re.append(path[:])
10 return
11 for i in range(len(nums)):
12 if(nums[i] in path): continue
13 path.append(nums[i])
14 self.backtracking(nums,path,re)
15 path.pop()

permute

47:全排列II

链接:47. 全排列 II - 力扣(LeetCode)

每次递归传入的数组,需要将上一次path添加的元素删除

 1 class Solution:
2 def permuteUnique(self, nums: List[int]) -> List[List[int]]:
3 if(not nums): return []
4 re=[]
5 self.backtracking(nums,[],re,len(nums))
6 return re
7 def backtracking(self,nums,path,re,lens):
8 if(len(path)==lens):
9 re.append(path[:])
10 return
11 uset=set()
12 for i in range(len(nums)):
13 if(nums[i] in uset): continue
14 uset.add(nums[i])
15 path.append(nums[i])
16 self.backtracking(nums[:i]+nums[i+1:],path,re,lens)
17 path.pop()

permuteUnique

==============================================================================================

头痛痛~~想请个假真的是难死,俩领导相互踢皮球,MMD,在自己能力范围内最大限度的为难别人的人都该死,天煞的!!!!再不回消息半夜还给你俩打电话

Leetcode刷题第六天-回溯的更多相关文章

  1. LeetCode刷题191203 --回溯算法

    虽然不是每天都刷,但还是不想改标题,(手动狗头 题目及解法来自于力扣(LeetCode),传送门. 算法(78): 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明: ...

  2. LeetCode刷题笔记-回溯法-分割回文串

    题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...

  3. LeetCode刷题 DFS+回溯

    一.DFS介绍 二.LeetCode 实战 LC 17. 电话号码的字母组合 解法思路 解题步骤 代码 LC 79. 单词搜索 解题思路 解题步骤 代码 LC 46. 全排列 解题思路一 解题步骤 代 ...

  4. LeetCode刷题笔记-回溯法-括号生成

    题目描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "( ...

  5. LeetCode刷题笔记-回溯法-组合总和问题

    题目描述: <组合总和问题>给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. cand ...

  6. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  7. LeetCode刷题总结-树篇(上)

          引子:刷题的过程可能是枯燥的,但程序员们的日常确不乏趣味.分享一则LeetCode上名为<打家劫舍 |||>题目的评论: 如有兴趣可以从此题为起点,去LeetCode开启刷题之 ...

  8. LeetCode刷题的一点个人建议和心得

    目录 1.    为什么我们要刷LeetCode? 2.    LeetCode的现状和问题 3.    本文的初衷 4.    LeetCode刷题建议 4.1入门数据结构,打基础阶段 4.2 建立 ...

  9. LeetCode刷题专栏第一篇--思维导图&时间安排

    昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...

  10. leetcode 刷题进展

    最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多  前200的吃透了 足以应付非算法岗 ...

随机推荐

  1. Function--jdk8用法

    Lambda表达式.首先是参数部分,接着是->,可以视为产出,->之后的内容都是方法体. 当只有一个参数时,可以不需要括号(): 正常情况使用()包裹参数,为了保持一致性,也可以使用括号( ...

  2. 为什么 Serverless 能提升资源利用率?

    木吴|阿里云智能高级技术专家 业务的负载往往不是一成不变的,而是随着时间呈现一定的上下波动.传统的应用构建方式一般是备足充分的资源以保障业务可用性,造成资源利用率不高的现象.随着容器技术的普及,应用可 ...

  3. Java 内存管理最佳实践

    本文翻译自国外论坛 medium,原文地址:https://medium.com/@fullstacktips/best-practices-for-memory-management-in-java ...

  4. java基础-反射-day15

    目录 1. 案例引入 2. Class 的理解 3. 反射的详细使用 4. Class 类都有哪些实例 5. 详细使用 6. 获取属性 7. 获取方法 8 获取类的 接口 注解 所在的包 9. 思考 ...

  5. 深入理解java线程池 一

    本文为博主原创,未经允许不得转载: 在多线程和高并发场景中,需要创建大量的线程来进行业务处理,我们通常创建线程有两种方法,一种是通过继承Thread类,另一种是实现Runnable的接口,但是我们创建 ...

  6. Oracle官网下载软件需要登录Oracle账户问题

    问题描述 当我们在Oracle官网上下载JDK时,(JDK下载地址)系统会提示需要登录Oracle账户.对于没有Oracle账户的人来说,注册账户太繁琐. 没有账户怎么办??? 此处推荐一个靠谱的网站 ...

  7. [STM32H7] 实战技能分享,如何让工程代码各种优化等级通吃,含MDK AC5,AC6,IAR和GCC

    引出问题:    一个好的工程项目代码,特别是开源类的,如果能做到各种优化等级通吃,是一种非常好的工程案例,这样别人借鉴的时候,可以方便的适配到自己工程里.但实际项目中,针对一款产品代码,我们一般不会 ...

  8. mongo-连接失败

    连接mongo失败 默认情况下,mongo最大支持65535个连接 查询当前支持的连接数 db.serverStatus.connections { "current" : 3,/ ...

  9. [转帖]Nginx 性能优化

    目录 1.调整 worker 进程数 2.调整 worker 连接数 3.调整 work 进程最大打开文件数 4.开启高效文件传输模式 5.限制文件上传大小 6.开启 gzip 压缩 7.本地缓存静态 ...

  10. [转帖]Shell脚本数组(实现冒泡排序,直接选择排序,反转排序)

    目录 数组 数组定义方法 数组包括的数据类型 获取数组长度 读取某下标赋值 数组遍历 数组切片 数组替换 删除数组 追加数组中的元素 从函数返回数组 加法传参运算 乘法传参运算 数组排序算法 冒泡排序 ...