Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में संयोजित स्ट्रिंग्स को विभाजित करें


मान लीजिए हमारे पास स्ट्रिंग्स की एक सूची है, हम इन स्ट्रिंग्स को एक लूप में संयोजित कर सकते हैं, जहां प्रत्येक स्ट्रिंग के लिए हम इसे उल्टा करना चुन सकते हैं या नहीं। सभी संभावित लूपों में से, हमें लूप को काटने के बाद शब्दकोश क्रम में सबसे बड़ी स्ट्रिंग ढूंढनी होगी, जो लूप्ड स्ट्रिंग को एक नियमित स्ट्रिंग में बदल देगा। विशेष रूप से, शब्दकोश क्रम में सबसे बड़ी स्ट्रिंग ढूंढने के लिए, हमें दो चरणों का अनुभव करना होगा:

दिए गए क्रम में सभी स्ट्रिंग्स को एक लूप में संयोजित करें, जहां हम कुछ स्ट्रिंग्स को उल्टा कर सकते हैं या नहीं।

लूप में किसी भी स्थान पर एक कटिंग बिंदु बनाएं, जो लूप्ड स्ट्रिंग को कटिंग बिंदु पर वर्ण से शुरू होने वाली एक नियमित स्ट्रिंग में बदल देगा। और काम सभी संभावित नियमित स्ट्रिंग्स में से शब्दकोश क्रम में सबसे बड़ी ढूंढना है।

उदाहरण के लिए, यदि इनपुट "abc", "xyz" है, तो आउटपुट "zyxcba" होगा क्योंकि हम लूप्ड स्ट्रिंग प्राप्त कर सकते हैं जैसे "-abcxyz-", "-abczyx-", "-cbaxyz-", "-cbazyx-"। उत्तर स्ट्रिंग चौथे लूप्ड से आई, जहां हम मध्य वर्ण 'a' से काट सकते हैं और "zyxcba" प्राप्त कर सकते हैं।

हल करने की विधि

हम निम्न चरणों का पालन करेंगे:

  • solve() फ़ंक्शन इंडेक्स, स्ट्रिंग्स सरणी, और रिवर्स फ्लैग लेता है।
  • वर्तमान स्ट्रिंग को लें, यदि रिवर्स है तो उल्टा करें।
  • इससे पहले और बाद की सभी स्ट्रिंग्स को संयोजित करें।
  • वर्तमान स्ट्रिंग के प्रत्येक संभावित कटिंग बिंदु के लिए, नई स्ट्रिंग बनाएं और अधिकतम अपडेट करें।
  • findMax() फ़ंक्शन प्रत्येक स्ट्रिंग को उसके उल्टे संस्करण के साथ तुलना करके अधिकतम संस्करण में बदलता है।
  • मुख्य विधि में: findMax कॉल करें, फिर प्रत्येक स्ट्रिंग के लिए solve को रिवर्स के साथ और बिना रिवर्स के कॉल करें।
  • अधिकतम स्ट्रिंग लौटाएं।

उदाहरण

बेहतर समझ के लिए निम्न कार्यान्वयन देखें:

#include <bits/stdc++.h> using namespace std; class Solution { public:    string ret;    void solve(int idx, vector <string > strs, bool rev){       string temp = strs[idx];       if (rev)          reverse(temp.begin(), temp.end());       string str1 = "";       string str2 = "";       for (int i = 0; i < idx; i++)          str1 += strs[i];       for (int i = idx + 1; i < strs.size(); i++)          str2 += strs[i];       for (int k = 0; k < temp.size(); k++) {          string newOne = temp.substr(k) + str2 + str1 + temp.substr(0, k);          if (ret == "" || ret < newOne) {             ret = newOne;          }       }    }    void findMax(vector<string>& strs){       for (int i = 0; i < strs.size(); i++) {          string temp = strs[i];          reverse(temp.begin(), temp.end());          strs[i] = strs[i] > temp ? strs[i] : temp;       }    }    string splitLoopedString(vector& strs) {       ret = "";       findMax(strs);       for (int i = 0; i < strs.size(); i++) {          solve(i, strs, false);          solve(i, strs, true);       }       return ret;    } }; main(){    Solution ob;    vector<string> v = {"abc", "xyz"};    cout << (ob.splitLoopedString(v)); }

इनपुट

{"abc", "xyz"}

आउटपुट

zyxcba

  1. - C++ में न्यूनतम स्ट्रिंग परिवर्तन

    मान लीजिए हमारे पास समान लंबाई की दो स्ट्रिंग्स s और t हैं, और दोनों लोअरकेस अक्षरों में हैं। पहले हम s को किसी भी क्रम में पुनर्व्यवस्थित करते हैं, फिर s को t में बदलने के लिए आवश्यक न्यूनतम परिवर्तनों की संख्या गिनते हैं। उदाहरण के लिए, यदि इनपुट है s = eccynue, t = science, तो आउटपुट 2 होगा। यद

  1. - C++ में सूची विभाजन

    मान लीजिए हमारे पास nums नामक पूर्णांकों की एक सूची है, हमें जांचना है कि क्या हम सूची को दो उप-सूचियों (गैर-खाली) में विभाजित कर सकते हैं जैसे कि बाएं भाग में हर संख्या दाएं भाग में हर संख्या से सख्ती से कम हो। उदाहरण के लिए, यदि इनपुट [6, 4, 3, 8, 10] है, तो आउटपुट true होगा, क्योंकि बाएं = [6,

  1. C++ में दो बाइनरी स्ट्रिंग्स को जोड़ें C++ में दो बाइनरी स्ट्रिंग्स को जोड़ें

    दो बाइनरी संख्या वाली स्ट्रिंग्स दी गई हैं, हमें उन दो बाइनरी स्ट्रिंग्स को जोड़कर प्राप्त परिणाम ढूंढना है और परिणाम को बाइनरी स्ट्रिंग के रूप में लौटाना है। बाइनरी संख्याएं वे संख्याएं हैं जिन्हें या तो 0 या 1 के रूप में व्यक्त किया जाता है। 2 बाइनरी संख्याओं को जोड़ते समय बाइनरी जोड़ का नियम हो