//General ArrayList o' Object implementation static void mutate(ArrayList pre, ArrayList suf, ArrayList> results) { if (suf.size() == 0) results.add(pre); for (int i = 0; i < suf.size(); i++) { ArrayList npre = (ArrayList) pre.clone(); ArrayList nsuf = (ArrayList) suf.clone(); npre.add(nsuf.remove(i)); mutate(npre, nsuf, results); } } //String implementation (less lines) static void mutate(String pre, String suf, ArrayList results) { if (suf.length() == 0) results.add(pre); for (int i = 0; i < suf.size(); i++) mutate(pre + suf.charAt(i), suf.substring(0, i) + suf.substring(i+1, i), results); }