Welcome to Subscribe On Youtube

1452. People Whose List of Favorite Companies Is Not a Subset of Another List

Description

Given the array favoriteCompanies where favoriteCompanies[i] is the list of favorites companies for the ith person (indexed from 0).

Return the indices of people whose list of favorite companies is not a subset of any other list of favorites companies. You must return the indices in increasing order.

 

Example 1:

Input: favoriteCompanies = [["leetcode","google","facebook"],["google","microsoft"],["google","facebook"],["google"],["amazon"]]
Output: [0,1,4] 
Explanation: 
Person with index=2 has favoriteCompanies[2]=["google","facebook"] which is a subset of favoriteCompanies[0]=["leetcode","google","facebook"] corresponding to the person with index 0. 
Person with index=3 has favoriteCompanies[3]=["google"] which is a subset of favoriteCompanies[0]=["leetcode","google","facebook"] and favoriteCompanies[1]=["google","microsoft"]. 
Other lists of favorite companies are not a subset of another list, therefore, the answer is [0,1,4].

Example 2:

Input: favoriteCompanies = [["leetcode","google","facebook"],["leetcode","amazon"],["facebook","google"]]
Output: [0,1] 
Explanation: In this case favoriteCompanies[2]=["facebook","google"] is a subset of favoriteCompanies[0]=["leetcode","google","facebook"], therefore, the answer is [0,1].

Example 3:

Input: favoriteCompanies = [["leetcode"],["google"],["facebook"],["amazon"]]
Output: [0,1,2,3]

 

Constraints:

  • 1 <= favoriteCompanies.length <= 100
  • 1 <= favoriteCompanies[i].length <= 500
  • 1 <= favoriteCompanies[i][j].length <= 20
  • All strings in favoriteCompanies[i] are distinct.
  • All lists of favorite companies are distinct, that is, If we sort alphabetically each list then favoriteCompanies[i] != favoriteCompanies[j].
  • All strings consist of lowercase English letters only.

Solutions

  • class Solution {
        public List<Integer> peopleIndexes(List<List<String>> favoriteCompanies) {
            Map<String, Integer> d = new HashMap<>();
            int idx = 0;
            int n = favoriteCompanies.size();
            Set<Integer>[] t = new Set[n];
            for (int i = 0; i < n; ++i) {
                var v = favoriteCompanies.get(i);
                for (var c : v) {
                    if (!d.containsKey(c)) {
                        d.put(c, idx++);
                    }
                }
                Set<Integer> s = new HashSet<>();
                for (var c : v) {
                    s.add(d.get(c));
                }
                t[i] = s;
            }
            List<Integer> ans = new ArrayList<>();
            for (int i = 0; i < n; ++i) {
                boolean ok = true;
                for (int j = 0; j < n; ++j) {
                    if (i != j) {
                        if (t[j].containsAll(t[i])) {
                            ok = false;
                            break;
                        }
                    }
                }
                if (ok) {
                    ans.add(i);
                }
            }
            return ans;
        }
    }
    
  • class Solution {
    public:
        vector<int> peopleIndexes(vector<vector<string>>& favoriteCompanies) {
            unordered_map<string, int> d;
            int idx = 0, n = favoriteCompanies.size();
            vector<unordered_set<int>> t(n);
            for (int i = 0; i < n; ++i) {
                auto v = favoriteCompanies[i];
                for (auto& c : v) {
                    if (!d.count(c)) {
                        d[c] = idx++;
                    }
                }
                unordered_set<int> s;
                for (auto& c : v) {
                    s.insert(d[c]);
                }
                t[i] = s;
            }
            vector<int> ans;
            for (int i = 0; i < n; ++i) {
                bool ok = true;
                for (int j = 0; j < n; ++j) {
                    if (i == j) continue;
                    if (check(t[i], t[j])) {
                        ok = false;
                        break;
                    }
                }
                if (ok) {
                    ans.push_back(i);
                }
            }
            return ans;
        }
    
        bool check(unordered_set<int>& nums1, unordered_set<int>& nums2) {
            for (int v : nums1) {
                if (!nums2.count(v)) {
                    return false;
                }
            }
            return true;
        }
    };
    
  • class Solution:
        def peopleIndexes(self, favoriteCompanies: List[List[str]]) -> List[int]:
            d = {}
            idx = 0
            t = []
            for v in favoriteCompanies:
                for c in v:
                    if c not in d:
                        d[c] = idx
                        idx += 1
                t.append({d[c] for c in v})
            ans = []
            for i, nums1 in enumerate(t):
                ok = True
                for j, nums2 in enumerate(t):
                    if i == j:
                        continue
                    if not (nums1 - nums2):
                        ok = False
                        break
                if ok:
                    ans.append(i)
            return ans
    
    
  • func peopleIndexes(favoriteCompanies [][]string) []int {
    	d := map[string]int{}
    	idx, n := 0, len(favoriteCompanies)
    	t := make([]map[int]bool, n)
    	for i, v := range favoriteCompanies {
    		for _, c := range v {
    			if _, ok := d[c]; !ok {
    				d[c] = idx
    				idx++
    			}
    		}
    		s := map[int]bool{}
    		for _, c := range v {
    			s[d[c]] = true
    		}
    		t[i] = s
    	}
    	ans := []int{}
    	check := func(nums1, nums2 map[int]bool) bool {
    		for v, _ := range nums1 {
    			if _, ok := nums2[v]; !ok {
    				return false
    			}
    		}
    		return true
    	}
    	for i := 0; i < n; i++ {
    		ok := true
    		for j := 0; j < n; j++ {
    			if i == j {
    				continue
    			}
    			if check(t[i], t[j]) {
    				ok = false
    				break
    			}
    		}
    		if ok {
    			ans = append(ans, i)
    		}
    	}
    	return ans
    }
    
  • function peopleIndexes(favoriteCompanies: string[][]): number[] {
        const n = favoriteCompanies.length;
        const d: Map<string, number> = new Map();
        let idx = 0;
        const nums: Set<number>[] = Array.from({ length: n }, () => new Set<number>());
    
        for (let i = 0; i < n; i++) {
            for (const s of favoriteCompanies[i]) {
                if (!d.has(s)) {
                    d.set(s, idx++);
                }
                nums[i].add(d.get(s)!);
            }
        }
    
        const check = (a: Set<number>, b: Set<number>): boolean => {
            for (const x of a) {
                if (!b.has(x)) {
                    return false;
                }
            }
            return true;
        };
    
        const ans: number[] = [];
        for (let i = 0; i < n; i++) {
            let ok = true;
            for (let j = 0; j < n && ok; j++) {
                if (i !== j && check(nums[i], nums[j])) {
                    ok = false;
                }
            }
            if (ok) {
                ans.push(i);
            }
        }
    
        return ans;
    }
    
    

All Problems

All Solutions