Backtracking / BFS / DFS

Share on:

Overview

DFS/BFS/Backtracking 作为一种暴力搜索手段,时常作为DP找不到公式的下位替代,主要难点在于如何优化。

Subsets & Permutations & Combinations

在解决permutation问题时, 除了用used来记录是否使用过,也可以用List的contains函数(虽然慢点)。

Permutation II 问题,可以先排序然后对每个结果toString做一个pattern看是否生成过,不过也可以用像subset II 一样做一个判断。

需要注意的是,在递归函数中,将tempList添加入结果的ArrayList,需要创建一个新的对象。如果直接添加,使用的是原对象的reference,而我们需要deep copy。

优化(结合记忆化 or DP)

需要注意的是,这系列问题需要考虑时间复杂度的问题,可以结合动态规划或者带记忆化的递归解决。

在Word break中,有个小技巧是使用了Boolean object 而不是原生的boolean来作为visited array,因为两者的初始值不同(Boolean null while boolean false)

结合String

String类型的有两个需要考虑的:一个是可以利用Java String immutable的特性直接带入,另一个是如果还是类比于list用StringBuilder的话删除是sb.setLength(sb.length() - 1)

结合Graph

在Word search中,可以使用亦或操作(bit mask)来避免使用额外的空间(vistied记录是否已经访问)。使用Bit mask使原来图上的数字变成一个非字符,调用完毕后再使用一次^=操作使其还原。Word search II 中使用了trie(字典树),相比于使用hashset + stringbuilder的方法,更加节省时间。

BFS & DFS

其他相关