One more bitmap java solution with bit more explanatory variable names
Okay, thanks @lee215 for this solution invention, but since python and python-style java solutions are not so easy  to understand, i decidedto make another atte
Okay, thanks @lee215 for this solution invention, but since python and python-style java solutions are not so easy  to understand, i decidedto make another attempt. (yes-yes probably its only me so dumb not getting those)\n\nHere is the idea and key difference with others:\n* Captain: iteratively solve the problem for each subset of required skills, binary mask for last result stands for "1111111" means each skill from required set is included (just in case this is not so much clear from the beginning as well..). \n* For each given skillset solution has been already calculated or not. If not we just skip it. (somehow it does not lead to anything bad) Otherwise extend given solution with every possible guy\'s set. Say for some guy G we are getting "*smallestSufficientTeam*" for some other skillset -- "*skillsetPlusGuy*". This extended "*skillsetPlusGuy*" might be new or be the not optimal, in either case this is the answer for "*skillsetPlusGuy*" skillset which is eventually extended to the solution -- as we guaranteed to have one.\n* I do not really understand why other solutions iterate over people first. - I\'m iterating over skillsets in outer loop as this imho better illustrates the idea.\n\nHope it somehow clear.\n\n```\nclass Solution {\n\t\n\tMap<String, Integer> skillMapping = new HashMap<>();\n\t\n    public int[] smallestSufficientTeam(String[] skills, List<List<String>> people) {\n\t\t\n\t\tint idx = 0;\n\t\tfor(String s: skills){\n\t\t\tskillMapping.put(s, 1<<(idx++));\n\t\t}\n\t\t\n\t\tList<Integer>[] solutions = new List[1 << skills.length];\n\t\tsolutions[0] = new ArrayList<>();\n\t\t\n\t\tfor(int skillset = 0; skillset < solutions.length - 1; i++){\n\t\t\tList<Integer> solutionForGivenSkillset = solutions[skillset];\n\t\t\tif(solutionForGivenSkillset == null)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tfor(int i = 0; i < people.size(); i++) {\n\t\t\t\tList<String> guySkills = people.get(i);\n\t\t\t\tint guyMask = skillsToMask(guySkills);\n\t\t\t\tint skillsetPlusGuy = skillset | guyMask;\n\t\t\t\t\n\t\t\t\tif(solutions[skillsetPlusGuy] == null || solutions[skillsetPlusGuy].size() > solutionForGivenSkillset.size() + 1){\n\t\t\t\t\tList<Integer> solutionForGivenSkillsetPlusGuy = new ArrayList<>(solutionForGivenSkillset);\n\t\t\t\t\tsolutionForGivenSkillsetPlusGuy.add(i);\n\t\t\t\t\tsolutions[skillsetPlusGuy] = solutionForGivenSkillsetPlusGuy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn solutions[solutions.length - 1];\n\t}\n\t\n\tprivate int skillsToMask(List<String> guySkills){\n\t\tint res = 0;\n\t\tfor(String sk: guySkills){\n\t\t\tres |= skillMapping.get(sk);\n\t\t}\n\t\treturn res;\n\t}\n}\t\n```
[]