Để tìm tất cả các hoán vị có thể của một chuỗi cho trước, bạn có thể sử dụng module itertools có phương thức hữu ích là permutations(iterable[, r]). Phương thức này trả về các hoán vị độ dài r liên tiếp của các phần tử trong iterable dưới dạng tuple.
Để lấy tất cả các hoán vị dưới dạng chuỗi, bạn sẽ cần lặp qua lời gọi hàm và nối các tuple. Ví dụ:
>>> from itertools import permutations
>>> print([''.join(p) for p in permutations('dune')])
['dune', 'duen', 'dnue', 'dneu', 'deun', 'denu', 'udne', 'uden', 'unde', 'uned', 'uedn', 'uend', 'ndue', 'ndeu', 'nude', 'nued', 'nedu', 'neud', 'edun', 'ednu', 'eudn', 'eund', 'endu', 'enud']
Nếu bạn không muốn sử dụng phương thức có sẵn, mà muốn tự tạo, bạn có thể sử dụng giải pháp đệ quy sau:
def permutations(string, step=0):
if step == len(string):
# đã đến cuối, in hoán vị
print("".join(string))
for i in range(step, len(string)):
# sao chép chuỗi (lưu dưới dạng mảng)
string_copy = [c for c in string]
# hoán đổi chỉ mục hiện tại với step
string_copy[step], string_copy[i] = string_copy[i], string_copy[step]
# đệ quy trên phần của chuỗi chưa được hoán đổi
permutations(string_copy, step + 1)
permutations('one')
KẾT QUẢ
one oen noe neo eno eon None