1. 无重复元素的排列
def permutation_without_repeated_element(data):
res, item = [], []
used = [False for _ in xrange(len(data))]
helper(data, res, item, used)
return res
def helper(data, res, item, used):
if len(item) == len(data):
if isinstance(item[0], str):
res.append(''.join(item))
else:
res.append(item[:])
else:
for idx, val in enumerate(data):
if not used[idx]:
used[idx] = True
item.append(val)
helper(data, res, item, used)
item.pop()
used[idx] = False
if __name__ == '__main__':
data = [1, 2, 3]
print permutation_without_repeated_element(data)
data = 'abc'
print permutation_without_repeated_element(data)
2. 有重复元素的排列
def permutation_with_repeated_element(data):
data = sorted(data)
print data
res, item = [], []
used = [False for _ in xrange(len(data))]
helper(data, res, item, used)
return res
def helper(data, res, item, used):
if len(item) == len(data):
if isinstance(item[0], str):
res.append(''.join(item))
else:
res.append(item[:])
else:
for idx, val in enumerate(data):
if idx > 0 and data[idx] == data[idx - 1] and not used[idx - 1]:
continue
if not used[idx]:
used[idx] = True
item.append(val)
helper(data, res, item, used)
item.pop()
used[idx] = False
if __name__ == '__main__':
data = [1, 1, 2]
print permutation_with_repeated_element(data)
data = 'abbc'
print permutation_with_repeated_element(data)