首页 > 其他分享 >Leetcode刷题第六天-回溯

Leetcode刷题第六天-回溯

时间:2024-01-31 17:48:46浏览次数:23  
标签:return nums self len 第六天 path Leetcode re 刷题

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,在自己能力范围内最大限度的为难别人的人都该死,天煞的!!!!再不回消息半夜还给你俩打电话

 

标签:return,nums,self,len,第六天,path,Leetcode,re,刷题
From: https://www.cnblogs.com/xiaoruru/p/17999763

相关文章

  • datawhale-leetcode打卡:038~050题
    两数相加(leetcode002)#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next=nextclassSolution:defaddTwoNumbers(self,l1:Optional[ListNode],l2:Optional[List......
  • [刷题笔记] ybt 1364:二叉树遍历(flist)
    Problem_LinkDescription树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。Analysis我们先前做过给定前序......
  • leetcode 42 单调栈解法
    Problem:42.接雨水目录思路解题方法复杂度Code思路作为自己独立完成的第一道困难题,我觉得有必要纪念一下。就是单调栈的思路,不过需要减去栈中的每一项才是雨水的体积。最后一个因为不是柱子,所以在结束循环时可能会出现栈未空的情况,需要倒着再考虑一遍。解题方法遇到比当......
  • LeetCode 2808 使循环数组所有元素相等的最少秒数
    题目描述原题链接:2808.使循环数组所有元素相等的最少秒数解题思路每次变化可以选择变成前一个元素或后一个元素,包括[0]和[n-1]的转化;换个角度思考,每秒最多可以有两个不同元素nums[i-1]和nums[i+1]变化成nums[i]元素;假设nums[i]元素只出现一次,想要将所有元素同化那么......
  • 代码随想录算法训练营第六天 |242. 有效的字母异位词 349. 两个数组的交集 202. 快乐
    1.两数之和 已解答简单 相关标签相关企业 提示 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同......
  • Leetcode刷题第五天-二分法-回溯
    215:第k个最大元素链接:215.数组中的第K个最大元素-力扣(LeetCode)em~~怎么说呢,快速选择,随机定一个目标值,开始找,左边比目标小,右边比目标大,左右同时不满足时,交换左右位置,直到左指针比右指针大,交换目标和右指针位置的值,此时右指针位置即时目标值的在排序好数组中的位置,如果k在右......
  • 第六天
    packageshuzu;importjava.util.Arrays;publicclassDemo08{publicstaticvoidmain(String[]args){//创建一个二维数组。0为黑,1为白int[][]qipan=newint[11][11];qipan[1][2]=1;qipan[2][3]=2;dayin(qipan);//转化为稀疏字符intsum=0;//读取非......
  • 每日刷题 绘制表格
    一.题目在中文Windows环境下,控制台窗口中也可以用特殊符号拼出漂亮的表格来。比如:┌─┬─┐│││├─┼─┤│││└─┴─┘其实,它是由如下的符号拼接的:左上=┌上=┬右上=┐左=├中心=┼右=┤左下=└下=┴右下=┘垂直=│水平=─......
  • [刷题笔记] 关于栈 & 队列常用操作方法的再探索
    Part0:序其实本来这都是很基础的东西,可惜野路子出身基础并不扎实。借着这个机会整合一下吧。也做了一些题了解了一些基本操作方法。本文对于栈和队列的原理不再过多赘述,默认读者掌握基本原理。参考题单:数据结构加强001:栈和队列2024现代信息学测试1:栈和队列本文所讲例题......
  • leetcode--98. 验证二叉搜索树(bfs)
    记录13:502024-1-28https://leetcode.cn/problems/validate-binary-search-tree/想岔方向了,想的太复杂了。首先思路是每个root节点必须大于左子树的最大节点,小于右边子树的最小节点。我的做法是记录下叶子节点,因为左边叶子节点的集合(vector)的最后一个节点为左子树的最大值......