回溯
08. 08 有重复字符串的排列组合
回溯|减枝
- 🔑🔑 难度:中等
有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。
示例1:
输入:S = "qqe"
输出:["eqq","qeq","qqe"]
class Solution:
def permutation(self, S: str) -> List[str]:
def backtrack(S, cur, chosen):
if len(cur) == len(S):
return ["".join(cur)]
else:
res = []
cut = set()
for i in range(len(S)):
if S[i] in cut or chosen[i]:
continue
chosen[i] = True
cur.append(S[i])
res += backtrack(S, cur, chosen)
cur.pop()
chosen[i] = False
cut.add(S[i])
return res
return backtrack(S, [], [False for _ in range(len(S))])
每次回溯的时候,有一些情况是不需要尝试的:
1. 要换入的这个位置的字符之前被使用过了;
2. 换入的字符没有被用过,但是出现了同样的字符。
08.07. 无重复字符串的排列组合
回溯
- 🔑🔑 难度:Medium 中等
无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。
示例1:
输入:S = "qwe"
输出:["qwe", "qew", "wqe", "weq", "ewq", "eqw"]
class Solution:
def permutation(self, S: str) -> List[str]:
n = len(S)
def backtrack(S, cur):
res = []
if len(cur) == n:
return ["".join(cur)]
else:
for i in range(len(S)):
cur.append(S[i])
res += backtrack(S[:i] + S[i + 1:], cur)
cur.pop()
return res
return backtrack(S, [])
模板!