private ArrayList<NonDuplicateArrayList<String>> getKSubset(NonDuplicateArrayList<String> set, int k){
		/*
		// recursive approach
		// ref: http://stackoverflow.com/questions/4504974/how-to-iteratively-generate-k-elements-subsets-from-a-set-of-size-n-in-java
		ArrayList<NonDuplicateArrayList<Integer>> subsets = new ArrayList<NonDuplicateArrayList<Integer>>();
		Integer[] subset = new Integer[k];
		processLargerSubsets(set, subset, 0, 0, subsets);
		return subsets;
		*/
		// iterative approach
		// ref: http://stackoverflow.com/questions/4504974/how-to-iteratively-generate-k-elements-subsets-from-a-set-of-size-n-in-java
		int c = (int) Math.binomial(set.size(), k);
		// ArrayList<NonDuplicateArrayList<Integer>> subsets = new ArrayList<NonDuplicateArrayList<Integer>>();
		ArrayList<NonDuplicateArrayList<String>> subsets = new ArrayList<NonDuplicateArrayList<String>>();
		for (int i = 0; i < c; i++)
			subsets.add(new NonDuplicateArrayList<String>());
			// subsets.add(new NonDuplicateArrayList<Integer>());
		int[] ind = k < 0?null:new int[k];
		for (int i = 0; i < k; i++)
			ind[i] = i;
		for (int i = 0; i < c; i++){
			for (int j = 0; j < k; j++)
				subsets.get(i).add(set.get(ind[j]));
			int x = ind.length - 1;
			boolean loop;
			do{
				loop = false;
				ind[x] = ind[x] + 1;
				if (ind[x] > set.size() - (k - x)){
					x--;
					loop = x >= 0;
				}
				else{
					for (int x1 = x + 1; x1 < ind.length; x1++)
						ind[x1] = ind[x1 - 1] + 1;
				}
			} while (loop);
		}
		return subsets;
	}