একটি স্ট্রিং অ্যারে words দেওয়া আছে। length(word[i]) * length(word[j])-র সর্বোচ্চ মান বের করতে হবে যাতে দুটি শব্দের কোনো সাধারণ অক্ষর নেই। ধরে নেওয়া হয় প্রতিটি শব্দ শুধু ছোট হাতের অক্ষর ধারণ করে। এমন দুটি শব্দ না থাকলে ০ ফেরত দিন। উদাহরণ: ["abcw", "baz", "foo", "bar", "xtfn", "abcdef"] হলে আউটপুট ১৬, কারণ দুটি শব্দ হতে পারে "abcw", "xtfn"।
সমাধানের ধাপগুলো:
getRev()মেথড বানান যাxনেবে:ret := 0i = 0থেকে ২৫ পর্যন্ত: যদি(x >> i) & 1 == 0,ret |= (1 << i)retফেরত দিন।
- মূল মেথড থেকে:
mম্যাপ,n := words.size()i = 0থেকেn-1পর্যন্ত:s := words[i], key := 0j = 0থেকেs.size()-1পর্যন্ত:key |= 1 << (s[j] - 'a')m[i] := key
ret := 0i = 0থেকেwords.size()-1পর্যন্ত:j = i+1থেকেwords.size()-1পর্যন্ত:- যদি
(m[i] & m[j]) == 0,ret := max(ret, words[i].size() * words[j].size())
- যদি
retফেরত দিন।
উদাহরণ (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