深度优先搜索|1593, 1079

深度优先搜索|1593. 拆分字符串使唯一子字符串的数目最大, 1079. 活字印刷

  • 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

你可能感兴趣的:(专题,深度优先,算法,leetcode,数据结构,python)