মান लीजिए हमारे पास एक फ़ाइल के लिए एक निरपेक्ष पथ है (यूनिक्स फ़ाइल सिस्टम की तरह), हमें इसे सरल करना है। या दूसरे शब्दों में, हमें इसे विहित पथ (canonical path) में बदलना है। यूनिक्स-शैली की फ़ाइल प्रणाली में, एक बिंदु '.' वर्तमान निर्देशिका को संदर्भित करता है। और एक दोहरा बिंदु '..' निर्देशिका को एक स्तर ऊपर ले जाता है (मूल निर्देशिका)। विहित पथ के गुण निम्नलिखित हैं।
- पथ हमेशा एक स्लैश / से शुरू होना चाहिए
- दो निर्देशिका नामों के बीच केवल एक ही स्लैश / होना चाहिए।
- अंतिम निर्देशिका नाम (यदि मौजूद है) को अनुगामी / के साथ समाप्त नहीं होना चाहिए।
- विहित पथ निरपेक्ष पथ को दर्शाने वाला सबसे छोटा स्ट्रिंग होना चाहिए।
उदाहरण के लिए, यदि दिए गए पथ "/home/", "/../" और "/home//user/" हैं, तो परिवर्तित पथ "/home", "/" और "/home/user" होंगे।
चरण देखते हैं −
- एक सूची st लें, और इसमें '/' डालें
- a := दिए गए पथ को '/' विभाजक से विभाजित करने के बाद स्ट्रिंग्स की एक सूची
- a में प्रत्येक तत्व i के लिए
- यदि i दोहरा बिंदु है, तो
- यदि st की लंबाई > 1 है, तो st से अंतिम तत्व हटाएं, अन्यथा जारी रखें
- अन्यथा यदि i एकल बिंदु है, तो जारी रखें
- अन्यथा यदि यह खाली स्ट्रिंग नहीं है, तो ('/' + i) को st में डालें
- यदि i दोहरा बिंदु है, तो
- यदि st में केवल एक तत्व है, तो '/' लौटाएं
- st में मौजूद सभी तत्वों को जोड़कर लौटाएं
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें −
उदाहरण
class Solution: def simplifyPath(self, a): st = ['/'] a = a.split("/") for i in a: if i == '..': if len(st) > 1: st.pop() else: continue elif i == '.': continue elif i != '': st.append("/" + str(i)) if len(st) == 1: return "/" return "".join(st[1:]) ob1 = Solution() print(ob1.simplifyPath("/home/")) print(ob1.simplifyPath("/../")) print(ob1.simplifyPath("/home//user/"))इनपुट
"/home/" "/../" "/home//user/"
आउटपुट
/home / /home/user