public List<String> similarities(String s, Iterable<String> words, int top) {
		if (s == null || words == null) {
			throw new IllegalArgumentException("Can not deal with null strings");
		}
		
		if (top < 1) {
			throw new IllegalArgumentException("At least one suggestion should desired");
		}

		PriorityQueue<CostSimilarity> queue = new PriorityQueue<CostSimilarity>(top, new Comparator<CostSimilarity>() {
			
			public int compare(CostSimilarity o1, CostSimilarity o2) {				
				if(o1.cost == o2.cost) return 0;
				
				if(o1.cost > o2.cost) return 1;
				
				return -1;
			}
		});
		
		
		for(String word: words){
			int cost = getLevenshteinDistance(s, word);
			CostSimilarity sc = new CostSimilarity(word, cost);
			
			if(queue.size() == top && queue.peek().cost > sc.cost){
				queue.poll();
			}			
			queue.add(sc);						
		}
		
		String similarities[] = new String[top];
		for(int i = 0; i < top; i++){
			similarities[i] = queue.poll().word;
		}
		return Arrays.asList(similarities);
	}