字符串全排列的插入排列递归实现
使用交换实现字符串的全排列,整个思路比较晦涩,难以理解,这里是我的另一递归实现,思路直接,容易理解递归的思路。
新的思路
字符串=左字符+右字符串部分
返回结果=左字符串+递归(右字符串部分)
交换的实现
def swap(swap_str, i, j):
"""
交换字符串input_str中的第i个元素和第j个元素
"""
swap_str = list(swap_str) # 先list化
temp = swap_str[i] #取中间值
swap_str[i] = swap_str[j] # 交换
swap_str[j] = temp # 交换
swap_str = "".join(swap_str) #将list字符串化
return swap_str #返回交换后的字符串
def new_perm(permed_str, start_position, end_position):
"""
when start_position + 1 == end_position
即排列的开始位置到达排列的终止位时,为出口条件,返回该字符串
否则
循环处理,对字符串从排列的开始位置开始到终止位置,
1、交换,对字符串,将start_position位置字符与循环位置字符进行交换,生成递归所需的permed_str
2、start_position + 1 ,递归调用自身,将排列结果返回给输出的列表,生成递归所需的start_position
3、递归调用,返回添加至输出列表中
"""
outputs = [] # 输出列表
if start_position + 1 == end_position: # 递归出口条件
outputs.append(permed_str)
else:
for ii in range(start_position, end_position): # 遍历
next_permed_str = swap(permed_str, start_position, ii) # 为递归调用准备 permed_str
next_start_position = start_position + 1 # 为递归调用准备 start_position
outputs += new_perm(next_permed_str, next_start_position, end_position) # 递归调用,返回添加至输出列表
return outputs
插入排列的实现
def full_permutation(input_str):
permutations = []
# 出口条件
if len(input_str) == 1:
permutations.append(input_str)
else:
left_letter = input_str[0] # 拆分成左右两部分
right_string = input_str[1:] # 右部分为待排列的,准备递归调用
sub_permutations = full_permutation(right_string) # 对右边部分进行递归调用,返回排列好的列表
# 右边部分排已列好了,将左边部分加入进行最终排列
for item in sub_permutations:
permutations.append(left_letter + item) # 新的排列第一项,
for j in range(len(item)):
left_part = item[0:j + 1]
right_part = item[j + 1:]
permutations.append(left_part + left_letter + right_part) # 新的排列依次各项,
return permutations