鱼C论坛

 找回密码
 立即注册
查看: 93|回复: 1

[已解决]力扣 面试题08.08有重复字符串的排列组合

[复制链接]
发表于 2025-8-8 09:56:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。

示例 1:

输入:S = "qqe"
输出:["eqq","qeq","qqe"]
示例 2:

输入:S = "ab"
输出:["ab", "ba"]

  1. class Solution:
  2.     def permutation(self, S: str) -> List[str]:
  3.         S = sorted(S)
  4.         n = len(S)
  5.         check = [False] * n
  6.         path = []
  7.         ans = []

  8.         @cache
  9.         def dfs():
  10.             if len(path) == n:
  11.                 ans.append(''.join(path))
  12.                 return

  13.             for i in range(n):
  14.                 if check[i]:
  15.                     continue
  16.                 if i > 0 and S[i] == S[i - 1] and not check[i - 1]:
  17.                     continue

  18.                 check[i] = True
  19.                 path.append(S[i])
  20.                 dfs()
  21.                 path.pop()
  22.                 check[i] = False

  23.         dfs()
  24.         return ans
复制代码


以上是题目与我的答案,为什么我的代码只能返回其中一个合法字符串,而不是所有合法字符串?
最佳答案
2025-8-8 09:57:42
您的代码存在几个关键问题导致只能返回一个结果。主要问题在于:

1. **变量初始化错误**:`check =  * n` 和 `path = ` 语法错误
2. **缺少函数参数**:`dfs()` 函数没有参数导致状态无法回溯
3. **缓存装饰器误用**:`@cache` 会阻止递归调用
4. **去重逻辑错误**:条件判断 `S == S` 应为 `S[i] == S[i-1]`

修正后的代码:


  1. class Solution:
  2.     def permutation(self, S: str) -> List[str]:
  3.         S = sorted(S)  # 排序使相同字符相邻
  4.         n = len(S)
  5.         check = [False] * n  # 标记访问状态
  6.         path = []  # 当前路径
  7.         ans = []   # 结果集

  8.         def dfs():
  9.             if len(path) == n:
  10.                 ans.append(''.join(path))
  11.                 return
  12.             
  13.             for i in range(n):
  14.                 # 跳过已访问或重复未访问字符
  15.                 if check[i]:
  16.                     continue
  17.                 if i > 0 and S[i] == S[i-1] and not check[i-1]:
  18.                     continue
  19.                
  20.                 # 选择当前字符
  21.                 check[i] = True
  22.                 path.append(S[i])
  23.                 dfs()  # 递归探索
  24.                 # 回溯
  25.                 path.pop()
  26.                 check[i] = False
  27.                
  28.         dfs()
  29.         return ans
复制代码


关键修正点:
1. 使用 check = [False] * n 初始化访问数组
2. 移除 @cache 装饰器(会阻止递归)
3. 修正去重条件为:S[i] == S[i-1] and not check[i-1]
4. 正确初始化 path = []

算法逻辑:
1. 排序字符串使相同字符相邻
2. DFS回溯时跳过:
   - 已使用的字符(check[i]==True
   - 与前字符相同且前字符未被使用的情况(避免重复排列)
3. 当路径长度等于原字符串时,记录有效排列

示例运行:
输入 "qqe" 输出:['eqq', 'qeq', 'qqe']
输入 "ab" 输出:['ab', 'ba']

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-8-8 09:57:42 | 显示全部楼层    本楼为最佳答案   
您的代码存在几个关键问题导致只能返回一个结果。主要问题在于:

1. **变量初始化错误**:`check =  * n` 和 `path = ` 语法错误
2. **缺少函数参数**:`dfs()` 函数没有参数导致状态无法回溯
3. **缓存装饰器误用**:`@cache` 会阻止递归调用
4. **去重逻辑错误**:条件判断 `S == S` 应为 `S[i] == S[i-1]`

修正后的代码:


  1. class Solution:
  2.     def permutation(self, S: str) -> List[str]:
  3.         S = sorted(S)  # 排序使相同字符相邻
  4.         n = len(S)
  5.         check = [False] * n  # 标记访问状态
  6.         path = []  # 当前路径
  7.         ans = []   # 结果集

  8.         def dfs():
  9.             if len(path) == n:
  10.                 ans.append(''.join(path))
  11.                 return
  12.             
  13.             for i in range(n):
  14.                 # 跳过已访问或重复未访问字符
  15.                 if check[i]:
  16.                     continue
  17.                 if i > 0 and S[i] == S[i-1] and not check[i-1]:
  18.                     continue
  19.                
  20.                 # 选择当前字符
  21.                 check[i] = True
  22.                 path.append(S[i])
  23.                 dfs()  # 递归探索
  24.                 # 回溯
  25.                 path.pop()
  26.                 check[i] = False
  27.                
  28.         dfs()
  29.         return ans
复制代码


关键修正点:
1. 使用 check = [False] * n 初始化访问数组
2. 移除 @cache 装饰器(会阻止递归)
3. 修正去重条件为:S[i] == S[i-1] and not check[i-1]
4. 正确初始化 path = []

算法逻辑:
1. 排序字符串使相同字符相邻
2. DFS回溯时跳过:
   - 已使用的字符(check[i]==True
   - 与前字符相同且前字符未被使用的情况(避免重复排列)
3. 当路径长度等于原字符串时,记录有效排列

示例运行:
输入 "qqe" 输出:['eqq', 'qeq', 'qqe']
输入 "ab" 输出:['ab', 'ba']

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-30 22:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表