You are given a string array features
where features[i]
is a single word that represents the name of a feature of the latest product you are working on. You have made a survey where users have reported which features they like. You are given a string array responses
, where each responses[i]
is a string containing space-separated words.
The popularity of a feature is the number of responses[i]
that contain the feature. You want to sort the features in non-increasing order by their popularity. If two features have the same popularity, order them by their original index in features
. Notice that one response could contain the same feature multiple times; this feature is only counted once in its popularity.
Return the features in sorted order.
Example 1:
Input: features = ["cooler","lock","touch"], responses = ["i like cooler cooler","lock touch cool","locker like touch"] Output: ["touch","cooler","lock"] Explanation: appearances("cooler") = 1, appearances("lock") = 1, appearances("touch") = 2. Since "cooler" and "lock" both had 1 appearance, "cooler" comes first because "cooler" came first in the features array.
Example 2:
Input: features = ["a","aa","b","c"], responses = ["a","a aa","a a a a a","b a"] Output: ["a","aa","b","c"]
Constraints:
1 <= features.length <= 104
1 <= features[i].length <= 10
features
contains no duplicates.features[i]
consists of lowercase letters.1 <= responses.length <= 102
1 <= responses[i].length <= 103
responses[i]
consists of lowercase letters and spaces.responses[i]
contains no two consecutive spaces.responses[i]
has no leading or trailing spaces.
class Solution:
def sortFeatures(self, features: List[str], responses: List[str]) -> List[str]:
feature_set = set(features)
counter = Counter()
for resp in responses:
for feat in set(resp.split(' ')):
if feat in feature_set:
counter[feat] += 1
order = {feat: i for i, feat in enumerate(features)}
return sorted(features, key=lambda feat: (-counter[feat], order[feat]))
class Solution {
public String[] sortFeatures(String[] features, String[] responses) {
Set<String> featureSet = new HashSet<>();
Map<String, Integer> order = new HashMap<>();
for (int i = 0; i < features.length; ++i) {
featureSet.add(features[i]);
order.put(features[i], i);
}
Map<String, Integer> counter = new HashMap<>();
for (String resp : responses) {
Set<String> s = new HashSet<>();
String[] words = resp.split(" ");
for (String word : words) {
s.add(word);
}
for (String word : s) {
if (featureSet.contains(word)) {
counter.put(word, counter.getOrDefault(word, 0) + 1);
}
}
}
String[] copyFeatures = Arrays.copyOf(features, features.length);
Arrays.sort(copyFeatures, (a, b) -> {
int diff = counter.getOrDefault(b, 0) - counter.getOrDefault(a, 0);
return diff == 0 ? order.get(a) - order.get(b) : diff;
});
return copyFeatures;
}
}