Generating all permutations of a given string

前端 未结 30 1716
我寻月下人不归
我寻月下人不归 2020-11-21 06:35

What is an elegant way to find all the permutations of a string. E.g. permutation for ba, would be ba and ab, but what about longer st

30条回答
  •  故里飘歌
    2020-11-21 07:01

    Here is my solution that is based on the idea of the book "Cracking the Coding Interview" (P54):

    /**
     * List permutations of a string.
     * 
     * @param s the input string
     * @return  the list of permutations
     */
    public static ArrayList permutation(String s) {
        // The result
        ArrayList res = new ArrayList();
        // If input string's length is 1, return {s}
        if (s.length() == 1) {
            res.add(s);
        } else if (s.length() > 1) {
            int lastIndex = s.length() - 1;
            // Find out the last character
            String last = s.substring(lastIndex);
            // Rest of the string
            String rest = s.substring(0, lastIndex);
            // Perform permutation on the rest string and
            // merge with the last character
            res = merge(permutation(rest), last);
        }
        return res;
    }
    
    /**
     * @param list a result of permutation, e.g. {"ab", "ba"}
     * @param c    the last character
     * @return     a merged new list, e.g. {"cab", "acb" ... }
     */
    public static ArrayList merge(ArrayList list, String c) {
        ArrayList res = new ArrayList<>();
        // Loop through all the string in the list
        for (String s : list) {
            // For each string, insert the last character to all possible positions
            // and add them to the new list
            for (int i = 0; i <= s.length(); ++i) {
                String ps = new StringBuffer(s).insert(i, c).toString();
                res.add(ps);
            }
        }
        return res;
    }
    

    Running output of string "abcd":

    • Step 1: Merge [a] and b: [ba, ab]

    • Step 2: Merge [ba, ab] and c: [cba, bca, bac, cab, acb, abc]

    • Step 3: Merge [cba, bca, bac, cab, acb, abc] and d: [dcba, cdba, cbda, cbad, dbca, bdca, bcda, bcad, dbac, bdac, badc, bacd, dcab, cdab, cadb, cabd, dacb, adcb, acdb, acbd, dabc, adbc, abdc, abcd]

提交回复
热议问题