Cho chuỗi input_str. Xét tất cả các chuỗi con có thể tạo thành từ chuỗi này, sắp xếp chúng theo thứ tự từ điển (lexicographical), sau đó nối tất cả thành một chuỗi lớn. Cho thêm số nguyên k, hãy tìm ký tự tại chỉ số k (0-based) trong chuỗi nối đó.
Ví dụ: input_str = 'pqrs', k = 6 → kết quả 'p'.
Các chuỗi con theo thứ tự từ điển: p, pq, pqr, pqrs, q, qr, qrs, r, rs, s. Chuỗi nối: ppqpqrpqrsqqrqrsrrss. Vị trí 6 là 'p'.
Thuật toán giải quyết (Duyệt DFS với stack)
- Khởi tạo stack với tuple
('', list(range(len(input_str)))) - Khi stack không rỗng:
- Lấy
pre(tiền tố hiện tại) vàtemp(danh sách chỉ số khả thi) - Nếu
k < len(pre): trả vềpre[k] - Cập nhật
k -= len(pre) - Tạo
input_sortedchứa các cặp(ký tự, vị trí)từtemp, sắp xếp giảm dần theo ký tự - Duyệt
input_sorted, gom nhóm các ký tự giống nhau, đẩy(pre + ký tự, danh_sách_vị_trí_mới)vào stack
- Lấy
- Trả về
Nonenếu không tìm thấy
Ví dụ minh họa
def solve(input_str, k):
stk_list = [("", list(range(len(input_str))))]
while stk_list:
pre, temp = stk_list.pop()
if k < len(pre):
return pre[k]
k -= len(pre)
input_sorted = sorted([(input_str[i], i+1) for i in temp if i < len(input_str)], reverse=True)
i = 0
while i < len(input_sorted):
val = input_sorted[i][0]
temp1 = [input_sorted[i][1]]
j = i + 1
while j < len(input_sorted) and input_sorted[j][0] == val:
temp1.append(input_sorted[j][1])
j += 1
stk_list.append((pre + val, temp1))
i = j
return None
print(solve('pqrs', 6))
Đầu vào
'pqrs', 6
Đầu ra
p