从今天起重新做人,打算用python刷题。因为java用得太少,感觉语法和类型没有肌肉记忆总会忘。py经常用,忘的概率会小一点点。
主要思路:
- 递归,DFS,剪枝。
- 递归终止:当DFS进行到
len(s)-1
时说明当前分支深度搜索已经完成,返回一个字符串。 - 递推:当DFS进行到第
x
位时,依次递推将x
位和range(x, len(s)-1)
位置的第i
位交换,然后进入下一层递归dfs(x+1)
,递归结束返回当前一层后将交换的两位还原,全当无事发生。 - 剪枝:例如
abbcc
的输入字符串可能会导致两位交换后的DFS过程不能说是毫无差别,只能说是完全一致。这种情况在每一层递归的时候新建一个hashset保存本层已经固定处理过的字符,而在递推的过程中就可以对已经固定过的字符进行剪枝操作。
代码:
1 | def permutation(self, s: str) -> List[str]: |