मान लीजिए हमारे पास स्ट्रिंग्स की एक सूची है; हमें उनमें से सबसे लंबे समय तक असामान्य अनुक्रम का पता लगाना है। सबसे लंबा असामान्य क्रम वास्तव में इनमें से किसी एक तार का सबसे लंबा अनुगमन होता है और यह क्रम किसी अन्य तार के बाद का नहीं होना चाहिए।
हम जानते हैं कि एक अनुक्रम एक अनुक्रम है जिसे शेष तत्वों के क्रम को बदले बिना कुछ वर्णों को हटाकर एक अनुक्रम से प्राप्त किया जा सकता है।
यहां हम स्ट्रिंग्स की एक सूची लेंगे, और आउटपुट को सबसे लंबे असामान्य बाद की लंबाई की आवश्यकता होगी। यदि कोई सबसे लंबा असामान्य क्रम नहीं है, तो -1 लौटें।
इसलिए, यदि इनपुट "ABA", "cdc", "eae" जैसा है, तो आउटपुट 3
. होगाइसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
फ़ंक्शन को परिभाषित करें isSubsequence(), इसमें a, b,
लगेगा -
जे:=0
-
इनिशियलाइज़ i :=0 के लिए, जब i
-
यदि j
-
(जम्मू को 1 से बढ़ाएं)
-
-
-
सही लौटें जब b का आकार j के समान हो
-
फ़ंक्शन को परिभाषित करें getDuplicates(), यह एक सरणी str लेगा,
-
एक सेट का दौरा किया और दूसरे सेट को फिर से परिभाषित करें
-
प्रारंभ करने के लिए मैं:=0, जब मैं
-
अगर strs[i] का दौरा किया जाता है, तो -
-
strs[i] को रिट में डालें
-
-
विज़िट में strs[i] डालें
-
-
वापसी रिट
-
मुख्य विधि से, निम्न कार्य करें -
-
स्ट्रिंग्स की लंबाई के आधार पर ऐरे स्ट्रिंग्स को सॉर्ट करें
-
एक सेट डुप्लिकेट को परिभाषित करें:=getDuplicates(strs)
-
प्रारंभ करने के लिए मैं:=0, जब मैं
-
अगर strs[i] डुप्लीकेट में है, तो -
-
निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं
-
-
अगर मैं 0 के समान हूं, तो -
-
स्ट्रैस का रिटर्न साइज[i]
-
-
इनिशियलाइज़ j :=0 के लिए, जब j
-
अगर isSubsequence(strs[j], strs[i]) गलत है, तो -
-
यदि j, i-1 के समान है, तो -
-
स्ट्रैस का रिटर्न साइज[i]
-
-
-
अन्यथा
-
लूप से बाहर आएं
-
-
-
-
वापसी -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