// -----------------
// Permutations.java
// -----------------

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

final class Permutations {
    /**
     * O(n!) in space
     * O(n!) in time
     */
    public static List<String> eval (String s) {
        final List<String> x = new ArrayList<String>();
        if (s.length() == 0) {
            return x;}
        if (s.length() == 1) {
            x.add(s);
            return x;}
        for (int i = 0; i != s.length(); ++i) {
            final char         c = s.charAt(i);
            final List<String> y = eval(s.substring(0, i) + s.substring(i + 1, s.length()));
            for (String t : y)
                x.add(c + t);}
        return x;}}

final class PermutationsTest {
    public static void main (String[] args) {
        System.out.println("Permutations.java");

        {
        List<String> x = Permutations.eval("");
        assert x.equals(new ArrayList<String>());
        }

        {
        List<String> x = Permutations.eval("a");
        assert x.equals(Arrays.asList("a"));
        }

        {
        List<String> x = Permutations.eval("ab");
        assert x.equals(Arrays.asList("ab", "ba"));
        }

        {
        List<String> x = Permutations.eval("abc");
        assert x.equals(Arrays.asList("abc", "acb", "bac", "bca", "cab", "cba"));
        }

        {
        List<String> x = Permutations.eval("aaa");
        assert x.equals(Arrays.asList("aaa", "aaa", "aaa", "aaa", "aaa", "aaa"));
        }

        System.out.println("Done.");}}


syntax highlighted by Code2HTML, v. 0.9.1