ধরুন আমাদের '(' , ')' এবং ছোট হাতের ইংরেজি অক্ষরের একটি স্ট্রিং আছে। আমাদের ন্যূনতম সংখ্যক বন্ধনী ('(' বা ')', যেকোনো অবস্থানে ) অপসারণ করতে হবে যাতে ফলস্বরূপ বন্ধনী স্ট্রিং বৈধ হয় এবং কোনো বৈধ স্ট্রিং ফেরত দেয়। একটি বন্ধনী স্ট্রিং বৈধ যখন এই সমস্ত মানদণ্ড পূরণ হয় −
-
এটি খালি স্ট্রিং, শুধুমাত্র ছোট হাতের অক্ষর ধারণ করে, অথবা
-
এটি AB এর ফর্ম হিসাবে লেখা যেতে পারে (B এর সাথে A সংযুক্ত), যেখানে A এবং B বৈধ স্ট্রিং, অথবা
-
এটি (A) এর ফর্ম হিসাবে লেখা যেতে পারে, যেখানে A একটি বৈধ স্ট্রিং।
সুতরাং ইনপুট যদি “a)b(c)d” এর মত হয়, তাহলে আউটপুট হবে “ab(c)d”
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি স্ট্যাক স্ট্যাক সংজ্ঞায়িত করুন
-
i এর জন্য 0 থেকে s আকারের সীমার মধ্যে
-
যদি s[i] ='(', তাহলে i ঢোকান st
এ -
অন্যথায় যখন s[i] হয় ‘)’, তখন
-
যদি স্ট্যাক খালি না হয়, তাহলে স্ট্যাক থেকে পপ করুন, অন্যথায় s[i] =‘*’
-
-
-
যখন সেন্ট খালি নয়,
-
s[স্ট্যাকের শীর্ষ উপাদান] ='*'
-
স্ট্যাক থেকে পপ
-
-
উত্তর :=খালি স্ট্রিং
-
0 থেকে s - 1
এর আকারের মধ্যে i এর জন্য-
যদি s[i] '*' না হয়, তাহলে উত্তর :=ans + s[i]
-
-
উত্তর ফেরত দিন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string minRemoveToMakeValid(string s) {
stack <int> st;
for(int i = 0; i < s.size(); i++){
if(s[i] == '(')st.push(i);
else if(s[i] == ')'){
if(!st.empty())st.pop();
else s[i] = '*';
}
}
while(!st.empty()){
s[st.top()] = '*';
st.pop();
}
string ans = "";
for(int i = 0; i < s.size(); i++){
if(s[i] != '*')ans += s[i];
}
return ans;
}
};
main(){
Solution ob;
cout << (ob.minRemoveToMakeValid("a)b(c)d"));
} ইনপুট
"a)b(c)d"
আউটপুট
ab(c)d