मान लीजिए हमारे पास एक स्ट्रिंग s है। इसमें केवल खुलने और बंद होने वाले पैरेंथेसिस हैं। हमें सबसे लंबे वैध (वेल-फॉर्म्ड) पैरेंथेसिस सबस्ट्रिंग की लंबाई ज्ञात करनी है। उदाहरण के लिए, यदि इनपुट है "))(())())", तो परिणाम 6 होगा, क्योंकि वैध स्ट्रिंग "(())()" है।
एल्गोरिदम (स्टैक आधारित)
- स्टैक बनाएं और
-1डालें,ans := 0 i = 0 से len(s)-1तक:- यदि
s[i] == "(", तोiको स्टैक में डालें - अन्यथा:
- यदि स्टैक खाली नहीं है और शीर्ष
-1नहीं है औरs[stack[-1]] == "(", तो पॉप करें औरans = max(ans, i - stack[-1]) - अन्यथा
iको स्टैक में डालें
- यदि स्टैक खाली नहीं है और शीर्ष
- यदि
ansवापस करें
उदाहरण
class Solution(object):
def solve(self, s):
stack = [-1]
ans = 0
for i in range(len(s)):
if s[i] == "(":
stack.append(i)
else:
if stack and stack[-1] != -1 and s[stack[-1]] == "(":
stack.pop()
ans = max(ans, i - stack[-1])
else:
stack.append(i)
return ans
ob = Solution()
print(ob.solve("))(())())"))
इनपुट
"))(())())"
आउटपुट
6