Java backtracking solution
\nclass Solution {\n    private final TreeMap<String, List<Integer>> skillCombo = new TreeMap<>();\n    \n    public int[] smallestSufficientTeam(String[] req_s
```\nclass Solution {\n    private final TreeMap<String, List<Integer>> skillCombo = new TreeMap<>();\n    \n    public int[] smallestSufficientTeam(String[] req_skills, List<List<String>> people) {\n        for (int i = 0; i < people.size(); i++) {\n            for(String skill : people.get(i)) {\n                List<Integer> skillPeople = skillCombo.getOrDefault(skill, new ArrayList<>());\n                skillPeople.add(i);\n                skillCombo.put(skill, skillPeople);\n            }\n        }\n        \n        LinkedList<String> neededSkillz = new LinkedList<>(Arrays.asList(req_skills));\n        \n        List<Integer> out = findSmallest(neededSkillz, people);\n        \n        return out.stream().mapToInt(Integer::intValue).toArray();\n    }\n    \n    private List<Integer> findSmallest(LinkedList<String> neededSkillz, List<List<String>> people) {\n        if (neededSkillz.isEmpty()) {\n            return new ArrayList<Integer>();\n        }\n        \n        String skill = neededSkillz.removeFirst();\n        \n        Integer shortest = null;\n        List<Integer> shortestList = null;\n        \n        for(int person : skillCombo.get(skill)) {\n            List<String> removedSkills = new ArrayList<>();\n            for(String pSkill : people.get(person)) {\n                if(neededSkillz.remove(pSkill)) {\n                    removedSkills.add(pSkill);\n                }\n            }\n            \n            List<Integer> otherSkills = findSmallest(neededSkillz, people);\n            if(shortest == null || otherSkills.size() < shortest) {\n                shortest = otherSkills.size();\n                shortestList = otherSkills;\n                shortestList.add(person);\n            }\n            neededSkillz.addAll(removedSkills);\n        }\n        \n        neededSkillz.add(skill);\n        \n        return shortestList;\n    }\n}\n```
[]