मान लीजिए कि हमारे पास एक टेक्स्ट है, हमें टेक्स्ट के लेक्सिकोग्राफ़िक रूप से सबसे छोटे अनुक्रम को ढूंढना है जिसमें टेक्स्ट के सभी अलग-अलग वर्ण बिल्कुल एक बार होते हैं। तो अगर इनपुट “cdadabcc” जैसा है, तो आउटपुट “adbc” होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक स्टैक सेंट को परिभाषित करें, दो नक्शे last_o और माना जाता है, वे शुरू में खाली हैं
- पाठ्यक्रम की लंबाई में i के लिए - 1 से 0 तक
- अगर टेक्स्ट[i] last_o में मौजूद नहीं है -
- last_o[text[i]] :=i
- माना जाता है[पाठ[i]]:=झूठा
- मैं :=0
- जबकि मैं <पाठ की लंबाई
- यदि स्टैक में कोई तत्व नहीं है
- पाठ को पुश करें[i] स्टैक में
- माना जाता है[पाठ[i]] :=सच
- मैं 1 से बढ़ाएँ
- अन्यथा स्टैक टॉप> टेक्स्ट[i] और माना जाता है[text[i]] गलत है
- अगर last_o[स्टैक टॉप]> i
- माना जाता है [स्टैक टॉप एलिमेंट] :=असत्य
- स्टैक से पॉप
- अन्यथा
- माना जाता है[tex[i]] =सच
- पाठ सम्मिलित करें[i] स्टैक में
- मैं 1 से बढ़ाएँ
- अगर last_o[स्टैक टॉप]> i
- अन्यथा जब स्टैक शीर्ष तत्व
- पाठ सम्मिलित करें[i] स्टैक में
- माना जाता है[पाठ[i]] :=सच
- मैं 1 से बढ़ाएँ
- यदि स्टैक में कोई तत्व नहीं है
- अन्यथा 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"