मान लीजिए कि हमारे पास एक स्ट्रिंग है, वह स्ट्रिंग एक वैध कोष्ठक स्ट्रिंग (वीपीएस के रूप में चिह्नित) है यदि और केवल तभी इसमें "(" और ")" वर्ण होते हैं, और यह इन गुणों को संतुष्ट करता है -
-
यह खाली स्ट्रिंग है, या
-
इसे AB के रूप में लिखा जा सकता है, जहाँ A और B VPS हैं, या
-
इसे (ए) के रूप में लिखा जा सकता है, जहां ए एक वीपीएस है।
हम नीचे दिए गए किसी भी वीपीएस एस की नेस्टिंग गहराई (एस) को भी परिभाषित कर सकते हैं -
-
गहराई ("") =0
-
गहराई (ए + बी) =अधिकतम गहराई (ए), गहराई (बी), जहां ए और बी वीपीएस हैं
-
गहराई ("(" + ए + ")") =1 + गहराई (ए), जहां ए एक वीपीएस है।
यदि हमारे पास VPS seq है, तो हमें इसे दो अलग-अलग अनुक्रमों A और B में विभाजित करना होगा, जैसे कि A और B VPS हैं (और A की लंबाई + B की लंबाई =seq की लंबाई)। अब अगर हम किसी ऐसे ए और बी को चुनते हैं जैसे कि अधिकतम (गहराई (ए), गहराई (बी)) न्यूनतम संभव मान है। फिर हमें एक उत्तर सरणी (seq की लंबाई की) ढूंढनी होगी जो A और B की ऐसी पसंद को एन्कोड करती है:उत्तर [i] =0 यदि seq [i] A का एक हिस्सा है, अन्यथा उत्तर [i] =1.पी>
तो अगर इनपुट "()(())()" जैसा है, तो आउटपुट [1,1,1,0,1,0,1,1]
होगाइसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
n :=seq की लंबाई, res :=0s की एक सरणी जिसकी लंबाई n है
-
c1, c2 :=0, 0
-
मैं के लिए 0 से n - 1 की सीमा में
-
अगर seq[i] ='('
-
यदि c1
-
-
अन्यथा
-
अगर c1> c2, तो c1 को 1 से घटाएं अन्यथा c2 को 1 से घटाएं और res[i]:=1
-
-
-
रिटर्न रेस
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
class Solution(object): def maxDepthAfterSplit(self, seq): n = len(seq) res = [0] *n c1,c2= 0,0 for i in range(n): if seq[i] == '(': if c1<c2: c1+=1 else: c2+=1 res[i]=1 else: if c1>c2: c1-=1 else: c2-=1 res[i]=1 return res ob = Solution() print(ob.maxDepthAfterSplit("()(())()"))
इनपुट
"()(())()"
आउटपुट
[1, 1, 1, 0, 1, 0, 1, 1]