मान लीजिए कि हमारे पास शब्द नामक एक स्ट्रिंग सरणी है, लंबाई (शब्द [i]) * लंबाई (शब्द [जे]) का अधिकतम मान ज्ञात करें जहां दो शब्द सामान्य अक्षरों को साझा नहीं करेंगे। हम मान सकते हैं कि प्रत्येक शब्द में केवल छोटे अक्षर होंगे। यदि ऐसे कोई दो शब्द मौजूद नहीं हैं, तो 0 लौटाएं। इसलिए यदि इनपुट ["abcw", "baz", "foo", "bar", "xtfn", "abcdef"] जैसा है, तो आउटपुट 16 होगा, क्योंकि दो शब्द "abcw", "xtfn" हो सकते हैं।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
getRev() नामक एक विधि को परिभाषित करें, यह x को इनपुट के रूप में लेगा
-
रिट:=0
-
मेरे लिए 0 से 25 की सीमा में
-
अगर x / (2^i) सम है, तो ret :=ret या 2^i
-
-
वापसी रिट
-
मुख्य विधि से, निम्न कार्य करें -
-
एक नक्शा बनाएं m n :=शब्द सरणी का आकार
-
मेरे लिए 0 से n - 1 की सीमा में
-
एस:=शब्द [i], कुंजी:=0
-
j के लिए 0 से s के आकार की सीमा में
- कुंजी:=कुंजी या 2^(s[j] - 'a' का ASCII)
-
एम [i] :=कुंजी
-
-
रिट:=0
-
मेरे लिए 0 से लेकर शब्दों के आकार तक - 1
-
j श्रेणी के लिए i + 1 शब्दों का आकार – 1
-
यदि m[i] और m[j] =0, तो ret :=शब्द का अधिकतम आकार [i] * शब्द का आकार[j]
-
-
-
वापसी रिट
उदाहरण(C++)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h&g; using namespace std; class Solution { public: int getRev(int x){ int ret = 0; for(int i = 0; i <= 25 ; i++){ if(!((x >> i) & 1)){ ret |= (1 << i); } } return ret; } int maxProduct(vector<string>& words) { unordered_map <int, int> m; int n = words.size(); for(int i = 0; i < n; i++){ string s = words[i]; int key = 0; for(int j = 0; j < s.size(); j++){ key |= 1 << (s[j] - 'a'); } m[i] = key; } int ret = 0; for(int i = 0; i < words.size(); i++){ for(int j = i + 1; j < words.size(); j++){ if((m[i] & m[j]) == 0){ //cout << i << " " << j << endl; ret = max(ret, (int)words[i].size() * (int)words[j].size()); } } } return ret; } }; main(){ Solution ob; vector<string> v = {"abcw","baz","foo","bar","xtfn","abcdef"}; cout << (ob.maxProduct(v)); }
इनपुट
["abcw","baz","foo","bar","xtfn","abcdef"]
आउटपुट
16