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

C++ में सबसे लंबी असामान्य उपअनुक्रम II


मान लीजिए हमारे पास स्ट्रिंग्स की एक सूची है; हमें उनमें से सबसे लंबी असामान्य उपअनुक्रम ढूंढना है। सबसे लंबी असामान्य उपअनुक्रम वास्तव में इन स्ट्रिंग्स में से एक का सबसे लंबा उपअनुक्रम है और यह उपअनुक्रम अन्य किसी स्ट्रिंग का उपअनुक्रम नहीं होना चाहिए।

हम जानते हैं कि एक उपअनुक्रम एक अनुक्रम है जिसे किसी अन्य अनुक्रम से कुछ वर्णों को हटाकर, शेष तत्वों के क्रम को बदले बिना प्राप्त किया जा सकता है।

यहां हम स्ट्रिंग्स की एक सूची लेंगे, और आउटपुट सबसे लंबी असामान्य उपअनुक्रम की लंबाई होनी चाहिए। यदि ऐसी कोई उपअनुक्रम नहीं है, तो -1 लौटाएं।

उदाहरण के लिए, यदि इनपुट "aba", "cdc", "eae" है, तो आउटपुट 3 होगा।

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

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

  • isSubsequence() फ़ंक्शन परिभाषित करें, जो जांचता है कि क्या स्ट्रिंग b, स्ट्रिंग a का उपअनुक्रम है।
  • getDuplicates() फ़ंक्शन परिभाषित करें, जो डुप्लिकेट स्ट्रिंग्स का सेट लौटाता है।
  • मुख्य विधि में:
    • स्ट्रिंग्स को लंबाई के अवरोही क्रम में सॉर्ट करें।
    • डुप्लिकेट सेट प्राप्त करें।
    • प्रत्येक स्ट्रिंग के लिए, यदि यह डुप्लिकेट है तो छोड़ दें।
    • यदि यह पहली स्ट्रिंग है (सबसे लंबी), तो इसकी लंबाई लौटाएं।
    • अन्यथा, जांचें कि क्या यह किसी पिछली स्ट्रिंग का उपअनुक्रम नहीं है। यदि यह किसी का उपअनुक्रम नहीं है, तो इसकी लंबाई लौटाएं।
  • यदि कोई नहीं मिला, तो -1 लौटाएं।

उदाहरण

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

#include <bits/stdc++.h> using namespace std; class Solution { public:    static bool cmp(string a, string b){       return a.size() > b.size();    }    int findLUSlength(vector<string>& strs){       sort(strs.begin(), strs.end(), cmp);       set<string> duplicates = getDuplicates(strs);       for (int i = 0; i < strs.size(); i++) {          if (duplicates.count(strs[i]))             continue;          if (i == 0)             return strs[i].size();          for (int j = 0; j < i; j++) {             if (!isSubsequence(strs[j], strs[i])) {                if ((j == i - 1)) {                   cout << i << endl;                   return strs[i].size();                }             }             else             break;          }       }       return -1;    }    bool isSubsequence(string a, string b){       int j = 0;       for (int i = 0; i < a.size(); i++) {          if (j < b.size() && a[i] == b[j])             j++;       }       return j == b.size();    }    set<string> getDuplicates(vector<string>& strs){       set<string> visited;       set<string> ret;       for (int i = 0; i < strs.size(); i++) {          if (visited.count(strs[i])) {             ret.insert(strs[i]);          }          visited.insert(strs[i]);       }       return ret;    } }; main(){    Solution ob;    vector<string> v = {"aba", "cdc", "eae"};    cout << (ob.findLUSlength(v)); }

इनपुट

{"aba", "cdc", "eae"}

आउटपुट

3

  1. - C++ में Number of Longest Increasing Subsequence

    मान लीजिए हमारे पास पूर्णांकों की एक अक्रमबद्ध सरणी है। हमें सबसे लंबी बढ़ती उपअनुक्रम (longest increasing subsequence) की संख्या ढूंढनी है, इसलिए यदि इनपुट [1, 3, 5, 4, 7] जैसा है, तो आउटपुट 2 होगा, क्योंकि बढ़ते उपअनुक्रम [1,3,5,7] और [1, 3, 4, 7] हैं।इसे हल करने के लिए, हम इन चरणों का पालन करेंगे

  1. - C++ प्रोग्राम: लॉन्गेस्ट कॉमन सबसीक्वेंस (LCS)

    एक सबसीक्वेंस तत्वों के समूह का वही क्रम वाला अनुक्रम है। अनुक्रम stuv के लिए, सबसीक्वेंस हैं stu, tuv, suv, आदि। लंबाई n के एक स्ट्रिंग के लिए, उस स्ट्रिंग से सबसीक्वेंस बनाने के 2^n तरीके हो सकते हैं। उदाहरण स्ट्रिंग्स ABCDGH और AEDFHR के लिए सबसे लंबी सामान्य सबसीक्वेंस की लंबाई 3 है। #include &l

  1. - पायथन में सबसे लंबा बढ़ता हुआ सबसीक्वेंस

    मान लीजिए हमारे पास पूर्णांकों की एक अनसॉर्टेड लिस्ट है। हमें सबसे लंबा बढ़ता हुआ सबसीक्वेंस ढूंढना है। इसलिए यदि इनपुट [10,9,2,5,3,7,101,18] है, तो आउटपुट 4 होगा, क्योंकि बढ़ता हुआ सबसीक्वेंस [2,3,7,101] है। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - trail := लंबाई 0 से nums की लंबाई - 1 तक