深度优先搜索|1593. 拆分字符串使唯一子字符串的数目最大, 1079. 活字印刷
1593. 拆分字符串使唯一子字符串的数目最大
这个题就是先想清楚,循环什么,index加什么,他并不是每次加一的,我用的是每次加上append的那个字符串的长度,下一次就加上的这个字符串结束的地方开始,然后还有比较有意思的是剪枝问题,因为其实只有前几次回溯能得到比较大的答案,越到后面就越是一整串出来所以长度就越小,所以根本没必要到后面去,这里得想办法给她剪掉。
所以想的办法就是每次去下一层的时候,假设之后的字符串都是单独出来加到path里去的,那就是现在这条path能达到的最大长度,连这个最大长度都比我们现在收集到的答案小了,那么就可以剪掉。
class Solution:
def maxUniqueSplit(self, s: str) -> int:
path = []
re = []
maxre = 0
def backtracking(index):
nonlocal maxre
if index == len(s):
re.append(len(path))
maxre = max(re)
return
# 剪枝
if len(path) + len(s) - index < maxre: return
for i in range(index,len(s)):
#print(s[index:(i+1)],path)
if s[index:(i+1)] not in path:
path.append(s[index:(i+1)])
#print(path)
backtracking(index+len(s[index:(i+1)]))
#break
path.pop()
backtracking(0)
return maxre
1079. 活字印刷
第二题和 全排列II 差不多,也是剪枝不太好像,具体看回溯篇
Vigorous Fermats94
Vigorous Fermats94
2023.07.26 10:57
详情
写题解
Python3
时间
124 ms
击败
15.48%
内存
21.1 MB
击败
14.75%
点击图片查看分布详情
备注
在此输入备注
相关标签
选择标签
0/5
class Solution:
def numTilePossibilities(self, tiles: str) -> int:
path = []
res = []
re = 0
used = [False]*len(tiles)
def backtracking(index):
nonlocal re
if path != []:
res.append(''.join(path))
if index == len(tiles):
re = len(res)
return
for i in range(len(tiles)):
if i > 0 and tiles[i] == tiles[i-1] and used[i-1] == False: continue
if used[i] == False:
path.append(tiles[i])
used[i] = True
backtracking(index+1)
used[i] = False
path.pop()
tiles = list(tiles)
tiles.sort()
tiles = ''.join(tiles)
backtracking(0)
return re