मान लीजिए हमें दिया गया है कि स्ट्रिंग "abc" वैध है। तो किसी भी वैध स्ट्रिंग V से, हम V को दो टुकड़ों X और Y में विभाजित कर सकते हैं जैसे कि X + Y, V के समान है। (X या Y खाली हो सकते हैं।) फिर, X + "abc" + Y भी वैध है। इसलिए उदाहरण के लिए S = "abc", तो वैध स्ट्रिंग्स के उदाहरण हैं: "abc", "aabcbc", "abcabc", "abcabcababcc"। और कुछ अवैध स्ट्रिंग्स के उदाहरण हैं: "abccba", "ab", "cababc", "bac"। हमें तभी true जांचना है जब दी गई स्ट्रिंग S वैध हो।
इसलिए यदि इनपुट "abcabcababcc" जैसा है, तो यह वैध है, इसलिए आउटपुट true होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
एक स्टैक st परिभाषित करें
i को 0 से S के आकार तक के लिए
यदि st खाली है या S[i] 'c' के समान नहीं है, तो S[i] को स्टैक में पुश करें
अन्यथा
c को st में सम्मिलित करें
जब तक st का आकार >= 3
c := st का शीर्ष और st से शीर्ष तत्व पॉप करें
b := st का शीर्ष और st से शीर्ष तत्व पॉप करें
a := st का शीर्ष और st से शीर्ष तत्व पॉप करें
temp := temp को a के साथ जोड़ें
temp := temp को b के साथ जोड़ें
temp := temp को c के साथ जोड़ें
यदि temp "abc" है, तो अगले पुनरावृत्ति के लिए जाएं
अन्यथा
a, फिर b, फिर c को st में पुश करें, और लूप तोड़ें
true लौटाएं जब st खाली हो, अन्यथा false लौटाएं
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: bool isValid(string S) { stack <char> st; for(int i = 0; i < S.size(); i++) { if(st.empty() || S[i] != 'c') { st.push(S[i]); } else { st.push('c'); while(st.size() >= 3) { char c = st.top(); st.pop(); char b = st.top(); st.pop(); char a = st.top(); st.pop(); string temp = ""; temp += a; temp += b; temp += c; if(temp == "abc") { continue; } else { st.push(a); st.push(b); st.push(c); break; } } } } return st.empty(); } }; int main() { Solution ob; cout << (ob.isValid("abcabcababcc")); }इनपुट
"abcabcababcc"
आउटपुट
1