递归法
这道题本质就是暴力枚举。如果字符串长度n确定,通过简单循环也能实现,即写n个for循环来枚举,但现在是字符串长度n可变,就需要用递归来实现(体现了递归存在的意义,实现了循环无法实现的“无限循环”或者说动态循环次数)。
实际上,原理跟n个for循环一样:
- 第1个for循环,从n个字符中锁定1个字符
- 第2个for循环,从剩下的n-1个字符中,再锁定一个
- 。。。
- 直到第n个循环,只有一个字符(即递归的回归条件)
- 第n个循环结束,退回到第n-1个循环,继续运行剩余的次数(即递归返回)
# @param str string字符串
# @return string字符串一维数组
#
class Solution:
def Permutation(self , subString: str) -> List[str]:
# 回归条件
length = len(subString)
if length <= 1:
return subString
# 每次固定一个元素,对剩下的元素再进行全排列,依次递归
Lists = []
for i in range(length):
# 固定一个元素
preString = subString[i]
# 剩下的元素继续递归
subList = self.Permutation(subString[0:i]+subString[i+1:])
# 解锁:将之前固定的元素和剩下元素的全排列,进行组合
for j in subList:
flag = preString + j
if flag not in Lists:
Lists.append(flag)
# 返回每一层递归组合后的所有结果
return Lists