মান লাগিয়ে, আমাদের একটি স্ট্রিং s আছে '(' এবং ')' পেরেনথেসিস সহ। একটি পেরেনথেসিস স্ট্রিং ব্যালেন্সড বলা হয় যখন:
- যেকোনো বাম পেরেনথেসিস '(' এর সংশ্লিষ্ট দুটি folyamতি ডান পেরেনথেসিস '))' থাকে।
- বাম পেরেনথেসিস '(' অবশ্যই সংশ্লিষ্ট দুটি folyamতি ডান পেরেনথেসিস '))' এর আগে থাকবে।
যেমন, "())", "())(())))" ব্যালেন্সড কিন্তু ")()", "()))" ব্যালেন্সড নয়। যদি এমন স্ট্রিং থাকে, তবে স্ট্রিং ব্যালেন্সড করার জন্য কতটি পেরেনথেসিস (খোলা বা বন্ধ) লাগবে তা গণনা করুন।
যেমন, ইনপুট s = "(())))))" হলে, আউটপুট হবে 1 কারণ যদি আমরা এটিকে ভাগ করি, তবে পাই "( ()) )) ))", তাই একটা বাম পেরেনথেসিস লাগবে স্ট্রিংকে "( ()) ()) ))" বানাতে যাতে সেটি ব্যালেন্সড হয়।
এটি সমাধান করতে আমরা নিচের ধাপগুলো অনুসরণ করব:
- o := 0, n := s-এর আকার
- ret := 0, i := 0
- i < n থাকা পর্যন্ত:
- যদি s[i] == '(' হয়, তবে o := o + 1
- অন্যথায়:
- যদি i + 1 < n এবং s[i + 1] == ')' হয়, তবে:
- যদি o == 0 হয়, তবে ret := ret + 1
- অন্যথায়, o := o - 1
- i := i + 1
- অন্যথায়:
- ret := ret + 1
- যদি o == 0 হয়, তবে ret := ret + 1
- অন্যথায়, o := o - 1
- i := i + 1
- যদি i + 1 < n এবং s[i + 1] == ')' হয়, তবে:
- ret + 2 * o রিটার্ন করুন
বेहतर বোঝার জন্য নিচের ইমপ্লিমেন্টেশন দেখুন:
উদাহরণ
def solve(s): o = 0 n = len(s) ret = 0 i = 0 while i < n: if s[i] == '(': o += 1 else: if i + 1 < n and s[i + 1] == ')': if not o: ret += 1 else: o -= 1 i += 1 else: ret += 1 if not o: ret += 1 else: o -= 1 i += 1 return ret + 2 * o s = "(())))))" print(solve(s))ইনপুট
"(())))))"
আউটপুট
3