字符串全排列的插入排列递归实现

​ 字符串全排列的插入排列递归实现
​ 使用交换实现字符串的全排列,整个思路比较晦涩,难以理解,这里是我的另一递归实现,思路直接,容易理解递归的思路。
​ 新的思路
​ 字符串=左字符+右字符串部分
​ 返回结果=左字符串+递归(右字符串部分)

交换的实现

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值