packagecom.company;import java.util.*;classSolution {
Map>>mp;int[] nums;
Set> impl(int start, inttarget) {
String key= "" + start + "_" +target;if(mp.containsKey(key)) {returnmp.get(key);
}
Set>ret;if (start
ret= new HashSet<>();
ret.addAll(impl(start+1, target));
}else{
ret= new HashSet<>();
}if (start > 0) {if (target == nums[start - 1]) {
List item = new ArrayList<>();
item.add(nums[start- 1]);//print(item, 1);
ret.add(item);
}else if (start < nums.length && target > nums[start - 1]) {
Set> tmpRet = impl(start + 1, target - nums[start - 1]);
Iterator> iter =tmpRet.iterator();while(iter.hasNext()) {
List item = new ArrayList<>(iter.next());//print(item, 2);
item.add(nums[start - 1]);
Collections.sort(item);//print(item, 3);//System.out.println("Start " + start + " target " + target);
ret.add(item);
}
}
}/*System.out.println("Begin ret:" + key);
Iterator> iter = ret.iterator();
while (iter.hasNext()) {
print(iter.next(), 4);
}
System.out.println("End ret:" + key);*/mp.put(key, ret);returnret;
}public List> combinationSum2(int[] candidates, inttarget) {
nums=candidates;
mp= new HashMap<>();
List> ret = new ArrayList<>();if (candidates.length == 0) {returnret;
}
impl(0, target);
String key= "" + 0 + "_" +target;
ret= new ArrayList<>(mp.get(key));returnret;
}void print(List item, intflag) {
System.out.printf("Here %d:", flag);
Iterator iter=item.iterator();while(iter.hasNext()) {
System.out.printf("%d,", iter.next());
}
System.out.println();
}
}public classMain {public static voidmain(String[] args) {
System.out.println("Hello!");
Solution solution= newSolution();int[] cand = {10,1,2,7,6,1,5};int target = 8;
List> ret = solution.combinationSum2(cand, 8);
System.out.printf("Get ret: %s\n", ret.size());
Iterator> iterator =ret.iterator();while(iterator.hasNext()) {
Iterator iter=iterator.next().iterator();while(iter.hasNext()) {
System.out.printf("%d,", iter.next());
}
System.out.println();
}
System.out.println();
}
}