import java.util.*;
public class Solution {public String[][] topKstrings (String[] strings, int k) {if(strings==null || strings.length==0){return null;}
HashMap<String,Integer> map = new HashMap();
for(String s : strings){map.put(s,map.getOrDefault(s,0)+1);
}
PriorityQueue<Node> minHeap = new PriorityQueue();
for(Map.Entry<String,Integer> entrySet : map.entrySet()){Node node = new Node(entrySet.getKey(),entrySet.getValue());
if(minHeap.size() < k){minHeap.add(node);
}else{if(minHeap.peek().compareTo(node) < 0){minHeap.poll();
minHeap.add(node);
}
}
}
String[][] result = new String[k][2];
for(int i=k-1;i>=0;i--){Node node = minHeap.poll();
result[i][0] = node.name;
result[i][1] = String.valueOf(node.count);
}
return result;
}
class Node implements Comparable<Node>{
String name;
int count;
public Node(String name,int count){
this.name = name;
this.count = count;
}
@Override
public int compareTo(Node node){if(this.count > node.count){return 1;}else if(this.count < node.count){return -1;}else{return node.name.compareTo(this.name);
}
}
}
}