Cho danh sách chuỗi words. Cần tìm độ dài lớn nhất của chuỗi được tạo bằng cách ghép nối một dãy con của words sao cho mỗi ký tự trong chuỗi kết quả chỉ xuất hiện một lần (không trùng lặp).
Ví dụ
Đầu vào: words = ["xyz", "xyw", "wab", "cde"]
Không thể chọn từ nào vì chúng chứa ký tự trùng lặp (x, y, w lặp lại). Kết quả: 9 (chọn "xyz" + "wab" + "cde" → "xyzwabcde" độ dài 9).
Thuật toán (Backtracking / DFS)
- Hàm helper
is_unique(s)kiểm tra chuỗi có toàn ký tự duy nhất không. - Hàm đệ quy
recur(i, current):- Nếu
i == len(words): cập nhậtans = max(ans, len(current)). - Bỏ qua từ
words[i]: gọirecur(i+1, current). - Nếu
words[i]có ký tự duy nhất VÀcurrent + words[i]cũng duy nhất: gọirecur(i+1, current + words[i]).
- Nếu
- Khởi tạo
ans = 0, gọirecur(0, ""), trả vềans.
Triển khai Python
class Solution:
def solve(self, words):
ans = 0
def is_unique(s):
return len(set(s)) == len(s)
def recur(i=0, cur=""):
nonlocal ans
if i == len(words):
ans = max(ans, len(cur))
return
# Không chọn words[i]
recur(i + 1, cur)
# Chọn words[i] nếu hợp lệ
if is_unique(words[i]) and is_unique(cur + words[i]):
recur(i + 1, cur + words[i])
recur()
return ans
# Test
ob = Solution()
print(ob.solve(["xyz", "xyw", "wab", "cde"])) # Output: 9
Độ phức tạp
- Thời gian: O(2ⁿ × L) với n số từ, L độ dài trung bình.
- Không gian: O(L) cho stack đệ quy.
Lưu ý: Có thể tối ưu bằng bitmask để biểu diễn tập ký tự.