สมมติว่าเรามีข้อความ เราต้องหาลำดับย่อยของข้อความที่เล็กที่สุดเกี่ยวกับพจนานุกรมศัพท์ซึ่งมีอักขระที่ชัดเจนทั้งหมดของข้อความในครั้งเดียว ดังนั้นหากอินพุตเป็นเหมือน “cdadabcc” เอาต์พุตจะเป็น “adbc”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดสแต็ก st, สองแผนที่ last_o และถือว่าว่างในตอนแรก
- สำหรับ i ในความยาวของช่วงข้อความ – 1 down to 0
- ถ้าไม่มีข้อความ[i] ใน last_o −
- last_o[text[i]] :=i
- ถือว่า[text[i]] :=false
- ผม :=0
- ในขณะที่ฉัน <ความยาวของข้อความ
- ถ้า stack ไม่มีองค์ประกอบ
- พุชข้อความ[i] ลงในสแต็ก
- ถือว่า[text[i]] :=true
- เพิ่ม i ขึ้น 1
- มิฉะนั้น stack top>
text[i] และพิจารณาว่า[text[i]] เป็นเท็จ
- iflast_o[stack top]> i
- ถือว่า[stack top element] :=false
- ป๊อปจากสแต็ก
- มิฉะนั้น
- ถือว่า[tex[i]] =จริง
- แทรก text[i] ลงในสแต็ก
- เพิ่ม i ขึ้น 1
- iflast_o[stack top]> i
- มิฉะนั้นเมื่อองค์ประกอบด้านบนสแต็ก
- แทรก text[i] ลงในสแต็ก
- ถือว่า[text[i]] :=true
- เพิ่ม i ขึ้น 1
- ถ้า stack ไม่มีองค์ประกอบ
- ไม่เช่นนั้นให้เพิ่ม i ขึ้น 1
- ถ้าไม่มีข้อความ[i] ใน last_o −
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution(object):
def smallestSubsequence(self, text):
"""
:type text: str
:rtype: str
"""
stack = []
last_o = {}
considered = {}
for i in range(len(text)-1,-1,-1):
if text[i] not in last_o:
last_o[text[i]] = i
considered[text[i]] = False
print(last_o)
i = 0
while i < len(text):
print(stack,i,text[i])
if len(stack) == 0:
stack.append(text[i])
considered[text[i]] = True
i+=1
elif stack[-1]>text[i] and considered[text[i]] == False:
if last_o[stack[-1]]>i:
considered[stack[-1]]=False
stack.pop()
else:
considered[text[i]] = True
stack.append(text[i])
i+=1
elif stack[-1]<text[i] and considered[text[i]] == False:
stack.append(text[i])
considered[text[i]] = True
i+=1
else:
i+=1
return "".join(i for i in stack) อินพุต
"cdadabcc"
ผลลัพธ์
"adbc"