You are given two string arrays positive_feedback and negative_feedback, containing the words denoting positive and negative feedback, respectively. Note that no word is both positive and negative.
Initially every student has 0 points. Each positive word in a feedback report increases the points of a student by 3, whereas each negative word decreases the points by 1.
You are given n feedback reports, represented by a 0-indexed string array report and a 0-indexed integer array student_id, where student_id[i] represents the ID of the student who has received the feedback report report[i]. The ID of each student is unique.
Given an integer k, return the top k students after ranking them in non-increasing order by their points. In case more than one student has the same points, the one with the lower ID ranks higher.
Example 1:
Input: positive_feedback = ["smart","brilliant","studious"], negative_feedback = ["not"], report = ["this student is studious","the student is smart"], student_id = [1,2], k = 2
Output: [1,2]
Explanation:
Both the students have 1 positive feedback and 3 points but since student 1 has a lower ID he ranks higher.
Example 2:
Input: positive_feedback = ["smart","brilliant","studious"], negative_feedback = ["not"], report = ["this student is not studious","the student is smart"], student_id = [1,2], k = 2
Output: [2,1]
Explanation:
- The student with ID 1 has 1 positive feedback and 1 negative feedback, so he has 3-1=2 points.
- The student with ID 2 has 1 positive feedback, so he has 3 points.
Since student 2 has more points, [2,1] is returned.
Both positive_feedback[i] and negative_feedback[j] consists of lowercase English letters.
No word is present in both positive_feedback and negative_feedback.
n == report.length == student_id.length
1 <= n <= 104
report[i] consists of lowercase English letters and spaces ' '.
There is a single space between consecutive words of report[i].
1 <= report[i].length <= 100
1 <= student_id[i] <= 109
All the values of student_id[i] are unique.
1 <= k <= n
Solutions
Solution 1: Hash Table + Sorting
We can store the positive words in a hash table \(ps\) and the negative words in a hash table \(ns\).
Then, we traverse the \(report\) and for each student, we store their score in an array \(arr\), where each element is a tuple \((t, sid)\), where \(t\) represents the student's score and \(sid\) represents the student's ID.
Finally, we sort the array \(arr\) in descending order by score, and if the scores are the same, we sort by ID in ascending order. Then, we take the IDs of the top \(k\) students.
The time complexity is \(O(n \times \log n + (|ps| + |ns| + n) \times |s|)\), and the space complexity is \(O((|ps|+|ns|) \times |s| + n)\). Here, \(n\) is the number of students, \(|ps|\) and \(|ns|\) are the number of positive and negative words, respectively, and \(|s|\) is the average length of a word.