[Python3] Easy to understand. No DP, no bitmask
\nclass Solution:\n    def smallestSufficientTeam(self, req_skills: List[str], people: List[List[str]]) -> List[int]:\n        n = len(req_skills)\n        # 1.
```\nclass Solution:\n    def smallestSufficientTeam(self, req_skills: List[str], people: List[List[str]]) -> List[int]:\n        n = len(req_skills)\n        # 1. Assign indexes for each skill string\n        skills = {\n            skill: i for i, skill in enumerate(req_skills)\n        }\n        # 2. Create sets with skill indexes for each person\n        people = [(i, {skills[skill] for skill in person}) for i, person in enumerate(people)]\n        # 3. Sort people by length of skillset\n        people.sort(key=lambda x: len(x[1]))\n\n        valid_people = []\n        # 4. Iterate over people list and check if person\'s skill set \n        # is a subset of other person\'s skill set. If it is, ignore it,\n        # otherwise, add it to `valid_people` list\n        for idx, person in enumerate(people):\n            i, skillset = person\n            is_valid = True\n\n            for j, s in people[idx + 1:]:\n                if skillset.issubset(s):\n                    is_valid = False\n                    break\n\n            if is_valid:\n                valid_people.append((i, skillset))\n\n        m = len(valid_people)\n        # 5. BFS: init deque with combinations of length 1 for every valid person index\n        d = deque([((i,)) for i in range(m)])\n\n        while d:\n            idxs = d.popleft()\n            # Receive skill set for current combination of people\n            skillset = set().union(*[valid_people[i][1] for i in idxs])\n\n            # 6. Check if current combination of people contains all the skills.\n            # If it does, return it as our answer.\n            # Since we\'re using BFS and go from shortest to longest combination,\n            # this combination is guaranteed to be the right answer.\n            if len(skillset) == n:\n                return [valid_people[i][0] for i in idxs]\n\n            # Iterate for all the remaining people in `valid_people`\n            for i in range(idxs[-1] + 1, m):\n                # Check if we\'ll gain new skills by adding this person to combination.\n                # If we won\'t, there\'s no point in adding such a combination to deque.\n                if valid_people[i][1] - skillset:\n                    d.append((idxs + (i, )))\n\n```
['Breadth-First Search', 'Python3']