สมมติว่าเราได้รับสตริง 'input_str' ตอนนี้ เราถูกขอให้กำหนดทุกสตริงย่อยที่เป็นไปได้จากสตริงที่กำหนด จากนั้นเชื่อมสตริงย่อยทั้งหมดทีละรายการในลำดับศัพท์เป็นสตริงอื่น เรายังได้รับค่าจำนวนเต็ม k งานของเราคือส่งคืนจดหมายที่ดัชนี k จากสตริงที่ต่อกัน
ดังนั้น หากอินพุตเป็นเหมือน input_str ='pqrs', k =6 เอาต์พุตจะเป็น p
สตริงย่อยจากสตริงที่ระบุในลำดับคำศัพท์คือ p, pq, pqr, pqrs, q, qr, qrs, r, rs, s.
หากเราเชื่อมสตริงเข้าด้วยกัน มันจะกลายเป็น ppqpqrpqrsqqrqrsrrss ที่ตำแหน่ง 6 ตัวอักษรคือ 'p' (การจัดทำดัชนีเริ่มต้นที่ 0).
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- stk_list :=รายการใหม่ที่มีทูเพิลที่มีสตริงว่างและรายการตัวอักษรทั้งหมดจาก input_str
- ในขณะที่ stk_list ไม่ว่างเปล่า ให้ทำ
- pre :=ลบองค์ประกอบสุดท้ายออกจาก stk_list
- temp :=ลบองค์ประกอบสุดท้ายออกจาก stk_list
- ถ้า k <ขนาดของพรี แล้ว
- กลับก่อน[k]
- k :=k - ขนาดของพรี
- input_sorted :=รายการใหม่ที่มี tuples ที่มีตัวอักษรของ input_str และตำแหน่งใน input_str
- เรียงลำดับรายการ input_sorted ตามค่าที่สองของ tuples ตามลำดับจากมากไปน้อย
- ผม :=0
- ในขณะที่ฉัน <ขนาดของ input_sorted ทำ
- val :=input_sorted[i, 0]
- temp1 :=[input_sorted[i, 11]]
- j :=ผม + 1
- ในขณะที่ j <ขนาดของ input_sorted และ input_sorted[j, 0] เหมือนกับ val ให้ทำ
- แทรก input_sorted[j, 1] ที่ส่วนท้ายของ temp1
- j :=j + 1
- แทรก (pre+val, temp1) ที่ส่วนท้ายของ stk_list
- ผม :=เจ
- คืนค่า null
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
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)) อินพุต
'pqrs', 6
ผลลัพธ์
p