Cho chuỗi s. Tách thành các chuỗi con không rỗng duy nhất (không trùng lặp) sao cho số lượng chuỗi con tối đa.
Ví dụ: s="pqpqrrr" → 5. Tách: ['p','q','pq','r','rr']. Không được tách ['p','q','p','q','r','rr'] vì 'p','q' trùng.
Giải thuật (DFS + Backtracking)
- DFS với tham số: chuỗi còn lại
s, setpathcác chuỗi con đã dùng. - Nếu
srỗng: cập nhậtres = max(res, len(path)). - Thử mọi độ dài tiền tố
itừ 1..len(s):x = s[:i].- Nếu
xchưa trongpath: đệ quydfs(s[i:], path ∪ {x}).
Ví dụ minh họa
def solve(s):
res = [0]
def dfs(s, path=set()):
if not s:
res[0] = max(res[0], len(path))
return
for i in range(1, len(s) + 1):
x = s[:i]
if x not in path:
dfs(s[i:], path | {x})
dfs(s)
return res[0]
s = "pqpqrrr"
print(solve(s))
Đầu vào
"pqpqrrr"
Đầu ra
5