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. JVM 内存大对象监控和优化实践

    作者:vivo 互联网服务器团队 - Liu Zhen.Ye Wenhao 服务器内存问题是影响应用程序性能和稳定性的重要因素之一,需要及时排查和优化.本文介绍了某核心服务内存问题排查与解决过程.首先 ...

  2. 技术文档丨 OpenSCA技术原理之npm依赖解析

    本文主要介绍基于npm包管理器的组件成分解析原理. npm介绍 npm(全称Node Package Manager)是Node.js标准的软件包管理器. npm的依赖管理文件是package.jso ...

  3. ios-class-guard - iOS代码混淆与加固实践

    ​ 目录 ios-class-guard - iOS代码混淆与加固实践 摘要 引言 一.class-dump 二.ios-class-guard 混淆原理 三.ios-class-guard 混淆结果 ...

  4. java对base64的图片进行压缩

    目标:用java将图片的base64码压缩到40kb以下. 依赖 <!-- 压缩图片--> <dependency> <groupId>net.coobird< ...

  5. js md5 和java md5后的值不一样

    开发发现js 对字符串md5 和 java对字符串md5 计算的结果居然不一样,后来找了一个匹配的这里记录一下 注:加密的对象中不能有空格,有空格md5后的结果就不一致,都是眼泪.. js md5算法 ...

  6. echarts常见问题及解决方法

    https://blog.csdn.net/weixin_46928381/article/details/122875609

  7. python常见面试题讲解(五)质数因子

    题目描述 功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 ) 最后一个数后面也要有空格 输入描述: 输入一个long型整数 输出描述 ...

  8. [java] - 获取上传到服务器上的文件路径

    request.getSession().getServletContext().getRealPath("upload/" );

  9. java - 对象装载数据传递到方法中

    1. 创建 Phone 类 package class_object; public class Phone { String brand; String color; double price; v ...

  10. [转帖]Sqlserver数据库中char、varchar、nchar、nvarchar的区别及查询表结构

    https://www.cnblogs.com/liuqifeng/p/10405121.html varchar 和 nvarchar区别: varchar(n)长度为 n 个字节的可变长度且非 U ...