📚

हीप का प्रयोग करके स्ट्रिंग से * और सबसे छोटे अक्षर को हटाना

Jun 27, 2024

हीप का प्रयोग करके स्ट्रिंग से * और सबसे छोटे अक्षर को हटाना*

प्रश्न का परिचय

  • प्रश्न: लीड कोड नंबर 3170, मीडियम लेवल
  • स्ट्रिंग S में किसी भी मात्रा में '*' कैरेक्टर हो सकते हैं
  • कार्य: सभी '*' कैरेक्टर्स को रिमूव करना है
  • '*' को हटाते वक्त उसके बाएं सबसे छोटे नॉन-स्टार कैरेक्टर को भी हटाना होगा
  • परिणाम: लेक्सिकोग्राफिकली स्मालेस्ट रिजल्टेंट स्ट्रिंग लौटानी है*

उदाहरण और अप्रोच

  • उदाहरण देकर समस्या का समाधान समझाना
  • '*' का सामना होने पर उसके लेफ्ट में सबसे छोटा नॉन-स्टार कैरेक्टर ढूंढना है और उसे हटाना है
  • 'एबीए' ऐसा सही उत्तर होगा अगर '*' और ए पहले हटे

बेसिक थॉट प्रोसेस

  • नॉन-स्टार कैरेक्टर्स को स्मॉलेस्ट ओर में स्टोर करना
  • ब्रूट फोर्स सॉल्यूशन नहीं चलेगा, क्योंकि यह ऑप्टिमल नहीं है
  • समस्या का समाधान करने के लिए हीप का प्रयोग

हीप का उपयोग

  • मिन-हीप को प्रयोग करना, जो हमें ओ(1) समय में सबसे छोटा कैरेक्टर दे सके
  • लेक्सिकली स्मॉलेस्ट कैरेक्टर हीप के टॉप पर रखना
  • स्मॉलेस्ट केरेक्टर के साथ उसका इंडेक्स भी स्टोर करना ताकि आउटर का ध्यान रखा जा सके

विस्तृत अप्रोच

  • जब ट्रेवर्स करते हैं तो नॉन-स्टार कैरेक्टर्स को उनकी पोज़िशन के साथ हीप में डालते हैं
  • '' पाते ही, हीप के टॉप से पॉप करते हैं और उस पोज़िशन को अपडेट करने के लिए '' डालते हैं
  • सभी '' को हटाने के बाद नई स्ट्रिंग का निर्माण करते हैं

कोडिंग अप्रोच

  1. स्ट्रिंग के लिए लंबाई निकालना
  2. प्रायोरिटी क्यू (हेप) को डिफाइन करना
  3. कस्टम कंपैरटर फंक्शन डिफ़ाइन करना जो पहले n का छोटा कैरेक्टर और उसके बाद सबसे बड़ा इंडेक्स सुनिश्चित करे
  4. स्ट्रिंग को ट्रेवरस करना अगर '*', तो सबसे छोटे कैरेक्टर को पॉप करना और अन्यथा हेप में डालना
  5. सभी * हटाने के बाद लीफ्ट ओवर स्ट्रिंग को कंपाइल करना

कोड का स्ट्रक्चर

int n = s.length(); priority_queue<pair<char, int>, vector<pair<char, int>>, comparator> pq; struct comparator { bool operator()(pair<char, int>& p1, pair<char, int>& p2) { if (p1.first == p2.first) return p1.second < p2.second; return p1.first > p2.first; } }; for (int i = 0; i < n; ++i) { if (s[i] != '*') { pq.push({s[i], i}); } else { auto [char, idx] = pq.top(); pq.pop(); s[idx] = '*'; } } string result; for (int i = 0; i < n; ++i) { if (s[i] != '*') result.push_back(s[i]); }

समय और स्पेस कॉम्प्लेक्सिटी

  • समय: O(n log n)
  • स्पेस: O(n)