99.5 % faster java solution
\nclass Solution {\n    \n    List<Integer> ans = new ArrayList<>();\n    \n    public int[] smallestSufficientTeam(String[] skills, List<List<String>> people) 
```\nclass Solution {\n    \n    List<Integer> ans = new ArrayList<>();\n    \n    public int[] smallestSufficientTeam(String[] skills, List<List<String>> people) {\n        int n = skills.length, m = people.size();\n        Map<String, Integer> map = new HashMap<>();\n        for (int i = 0; i < n; i++) {\n            map.put(skills[i], i);\n        }\n        int[] arr = new int[m];\n        for (int i = 0; i < m; i ++) {\n            List<String> list = people.get(i);\n            int val = 0;\n            for (String skill : list) {\n                val |= 1 << map.get(skill);\n            }\n            arr[i] = val;\n        }\n        boolean[] banned = new boolean[m];\n        for (int i = 0; i < m; i ++) {\n            for (int j = i + 1; j < m; j ++) {\n                int val = arr[i] | arr[j];\n                if (val == arr[i]) {\n                    banned[j] = true;\n                } else if (val == arr[j]) {\n                    banned[i] = true;\n                }\n            }\n        }\n        // System.out.println(Arrays.toString(banned));\n        // System.out.println(Arrays.toString(arr));\n        helper(0, n, arr, new ArrayList<>(), banned);\n        // System.out.println(ans);\n        int[] res = new int[ans.size()];\n        for (int i = 0; i < res.length; i ++) {\n            res[i] = ans.get(i);\n        }\n        return res;\n    }\n    \n    private void helper(int cur, int n, int[] arr, List<Integer> list, boolean[] banned) {\n        if (cur == (1 << n) - 1) {\n            if (ans.isEmpty() || ans.size() > list.size()) {\n                ans = new ArrayList<>(list);\n            }\n            return;\n        }\n        if (!ans.isEmpty() && list.size() >= ans.size()) {\n            return;\n        }\n        int zero = 0;\n        while (((cur >> zero) & 1) == 1) {\n            zero ++;\n        }\n        for (int i = 0; i < arr.length; i++) {\n            if (banned[i]) {\n                continue;\n            }\n            if (((arr[i] >> zero) & 1) == 1) {\n            // if ((cur | arr[i]) > cur) {\n                list.add(i);\n                helper(cur | arr[i], n, arr, list, banned);\n                list.remove(list.size() - 1);\n            }\n        }\n    }\n}\n```
['Bit Manipulation', 'Java']