classSolution { public: vector<string> ans, finalAns; int maxlen; int maxarea; map<int, unordered_set<string>, greater<>> len2string; Trie p; vector<string> maxRectangle(vector<string> &words){ maxlen = 0; maxarea = 0; for (auto &x: words) { p.insert(x); len2string[int(x.size())].insert(x); maxlen = max(maxlen, int(x.size())); } for (auto &x: len2string) { ans.clear(); dfs(x.first); } return finalAns; }
vector<bool> check(int m){ int n = ans.size(); bool flag = true; for (int i = 0; i < m; i++) { string t; TrieNode* cur = p.root; for (int j = 0; j < n; j++){ if(cur->next[ans[j][i]-'a'] == nullptr) return vector<bool>{false, false}; cur = cur->next[ans[j][i]-'a']; } if(!(cur->isWord)) flag = false; } return vector<bool>{true, flag}; }
voiddfs(int len){ if (maxlen * len <= maxarea) return; if (ans.size() >= maxlen) return; for (auto &x: len2string[len]) { ans.push_back(x); vector<bool> tmp = check(len); if (tmp[0]) { if (tmp[1]&&ans.size() * len > maxarea) { maxarea = ans.size() * len; finalAns = vector<string>(ans); } dfs(len); }