You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归生成字符串全排列中char_count[i] +=1的作用是什么?

字符串排列递归中char_count[i] +=1的作用解析

你提到的这段代码是用回溯法生成输入字符串的所有全排列,其中char_count数组用来统计每个小写字母在原字符串中的出现次数。

核心逻辑拆解

在递归函数search里,这段代码的流程是:

if char_count[i] > 0:
    char_count[i] -= 1
    search(curr + chr(ord("a") + i))
    char_count[i] += 1
  • char_count[i] -= 1:当选中第i个字母加入当前排列curr时,把该字母的剩余可用次数减1,标记它已经被用了一次,避免在后续递归分支里重复使用超出原字符串的数量。
  • 递归调用search(...):进入下一层递归,继续构建剩余长度的排列。
  • char_count[i] += 1的作用:这是回溯法里的「现场恢复」操作。当以当前字母开头的所有排列都生成完毕(递归调用返回),需要把该字母的可用次数加回去,让它可以被上层递归的其他循环分支使用。

举个简单例子:如果输入是"aab",第一次循环选中第一个'a'(char_count[0]从2减到1),递归生成所有以这个'a'开头的排列("aab"、"aba")。等这部分递归全部完成返回后,执行char_count[0] +=1把计数恢复回2,这样后续循环选中第二个'a'时,才能正常生成"baa"这个排列。如果没有这一步,char_count[0]会一直是1,后续分支就无法正确使用第二个'a'了。

完整代码回顾

s = input()
perms = []
char_count = [0] * 26


def search(curr: str = ""):
    # 生成完一个完整排列,加入结果列表
    if len(curr) == len(s):
        perms.append(curr)
        return
    for i in range(26):
        # 只处理还有剩余可用次数的字符
        if char_count[i] > 0:
            # 标记该字符已使用一次
            char_count[i] -= 1
            # 递归构建后续排列
            search(curr + chr(ord("a") + i))
            # 恢复字符可用次数,供其他分支使用
            char_count[i] += 1


# 初始化字符计数
for c in s:
    char_count[ord(c) - ord("a")] += 1

search()

# 输出结果
print(len(perms))
for perm in perms:
    print(perm)

内容的提问来源于stack exchange,提问作者Phantom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:27:26