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]:
cnt = Counter()
for r in responses:
ws = set(r.split())
for s in ws:
cnt[s] += 1
return sorted(features, key=lambda x: -cnt[x])
class Solution {
public String[] sortFeatures(String[] features, String[] responses) {
Map<String, Integer> cnt = new HashMap<>();
for (String r : responses) {
Set<String> ws = new HashSet<>();
for (String w : r.split(" ")) {
ws.add(w);
}
for (String w : ws) {
cnt.put(w, cnt.getOrDefault(w, 0) + 1);
}
}
int n = features.length;
Integer[] idx = new Integer[n];
for (int i = 0; i < n; ++i) {
idx[i] = i;
}
Arrays.sort(idx, (i, j) -> {
int d = cnt.getOrDefault(features[j], 0) - cnt.getOrDefault(features[i], 0);
return d == 0 ? i - j : d;
});
String[] ans = new String[n];
for (int i = 0; i < n; ++i) {
ans[i] = features[idx[i]];
}
return ans;
}
}
class Solution {
public:
vector<string> sortFeatures(vector<string>& features, vector<string>& responses) {
unordered_map<string, int> cnt;
for (auto& r : responses) {
stringstream ss(r);
string t;
unordered_set<string> ws;
while (ss >> t) {
ws.insert(t);
}
for (auto& w : ws) {
cnt[w]++;
}
}
int n = features.size();
vector<int> idx(n);
iota(idx.begin(), idx.end(), 0);
sort(idx.begin(), idx.end(), [&](int i, int j) -> bool {
int d = cnt[features[i]] - cnt[features[j]];
return d > 0 || (d == 0 && i < j);
});
vector<string> ans(n);
for (int i = 0; i < n; ++i) {
ans[i] = features[idx[i]];
}
return ans;
}
};
func sortFeatures(features []string, responses []string) []string {
cnt := map[string]int{}
for _, r := range responses {
ws := map[string]bool{}
for _, s := range strings.Split(r, " ") {
ws[s] = true
}
for w := range ws {
cnt[w]++
}
}
n := len(features)
idx := make([]int, n)
for i := range idx {
idx[i] = i
}
sort.Slice(idx, func(i, j int) bool {
d := cnt[features[idx[i]]] - cnt[features[idx[j]]]
return d > 0 || (d == 0 && idx[i] < idx[j])
})
ans := make([]string, n)
for i := range ans {
ans[i] = features[idx[i]]
}
return ans
}