문제가 잘 이해가 안되서 몇번 읽어본 것 같다.
구현 핵심은 크게 다음과 같다.
1. orders에 대해서 course의 combination을 구해야함
코드는 아래와 같다.
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <unordered_set>
#include <map>
using namespace std;
int visit[26];
vector<char> result;
vector<string> ans;
void combination(int n, int depth, int start, const string &orders)
{
if(depth == n) {
string str(depth, 0);
for(int i=0;i<depth;i++)
str[i] = result[i];
ans.push_back(str);
return;
}
for(int i=start;i<orders.size();i++) {
if(visit[i] == 1)
continue;
visit[i] = 1;
result[depth] = orders[i];
combination(n, depth + 1, i, orders);
visit[i] = 0;
}
return;
}
vector<string> solution(vector<string> orders, vector<int> course) {
vector<string> answer;
result.assign(11, 0);
for(int i=0;i<course.size();i++) {
map<string, int> already;
for(int j=0;j<orders.size();j++) {
sort(orders[j].begin(), orders[j].end());
if(already[orders[j]] == 1)
continue;
already[orders[j]] = 1;
if(course[i] < orders[j].size())
combination(course[i], 0, 0, orders[j]);
else if(course[i] == orders[j].size())
ans.push_back(orders[j]);
}
unordered_set<string> u(ans.begin(), ans.end());
map<string, int> m;
for(auto it : u)
m[it] = 0;
int max_len = 0;
for(auto it : m) {
int map[26] = { 0, };
for(int j=0;j<it.first.size();j++)
map[it.first[j] - 'A'] = 1;
int cnt = 0;
for(int j=0;j<orders.size();j++) {
if(orders[j].size() < it.first.size())
continue;
int tmp = 0;
for(int k=0;k<orders[j].size();k++)
if(map[orders[j][k] - 'A'] == 1) {
tmp++;
if(tmp == it.first.size()) {
cnt++;
break;
}
}
}
if(cnt > 1) {
m[it.first] += cnt;
max_len = max(m[it.first], max_len);
}
}
if(max_len == 0)
continue;
vector<string> tmp;
for(auto it : m)
if(it.second == max_len)
tmp.push_back(it.first);
for(auto it : tmp)
answer.push_back(it);
ans.clear();
}
sort(answer.begin(), answer.end());
return answer;
}