First of all, note that you're using extra memory unnecessarily. Why read everything into an array and then iterate through that array to insert everything in a hash table? Unless you have a very strong reason to do so, you should just put it into the hashtable as you read it.
That cuts the need for an array, and drops memory usage by O(n). The other steps sound pretty reasonable. The idea of maintaining an array with 10 entries for the top 10 scores is a nice approach, but it poses the question of how to do so efficiently.
Also, using a hash table can raise implementation issues, you are relying too much on something that is typically in built-in libraries. For the sake of the interview, maybe a better approach would be to read everything to a binary search tree where each node holds a structure with the string, and the number of occurrences of that string (and pointer to left and right node). Binary search trees enable you to see if a string is there in O(log(n)) time. After reading everything and placing it in the tree, you can sort the tree with shell sort. Shell sort is a good option for this exercise because it tends to eliminate large amounts of disorder quickly. This solution runs in O(nlog(n)) time.
If your interviewer is ok with using a hash table, maybe it's not worth the trouble of implementing a tree, but by saying "I'll use a hash table" you can be shooting yourself in the foot, unless of course you implement the hash table. It really depends on the context.