如何列出某些特定字符的所有可能组合?

时间:2018-04-04 16:30:56

标签: java html list

{A,B,C,D,E,F}如何列出这6个字母的所有可能不同的订单?

尝试随机生成一个字符串,如" ABDFEC"等等并添加到列表中,如果它已经在列表中跳过那个并且一次又一次地尝试。我能够找到600到700个,但不幸的是它坚持这些因为它找不到与以前不同的东西。

所以别担心这个愚蠢的想法。你的聪明才智是什么?请帮帮我

4 个答案:

答案 0 :(得分:1)

这可以通过回溯来实现。有关以下代码的详细信息,请参阅链接program to print all permutations of a given string

public class Permutation
{
    public static void main(String[] args)
    {
        String str = "ABC";
        int n = str.length();
        Permutation permutation = new Permutation();
        permutation.permute(str, 0, n-1);
    }

    /**
     * permutation function
     * @param str string to calculate permutation for
     * @param l starting index
     * @param r end index
     */
    private void permute(String str, int l, int r)
    {
        if (l == r)
            System.out.println(str);
        else
        {
            for (int i = l; i <= r; i++)
            {
                str = swap(str,l,i);
                permute(str, l+1, r);
                str = swap(str,l,i);
            }
        }
    }

    /**
     * Swap Characters at position
     * @param a string value
     * @param i position 1
     * @param j position 2
     * @return swapped string
     */
    public String swap(String a, int i, int j)
    {
        char temp;
        char[] charArray = a.toCharArray();
        temp = charArray[i] ;
        charArray[i] = charArray[j];
        charArray[j] = temp;
        return String.valueOf(charArray);
    }

}

<强>输出:

ABC
ACB
BAC
BCA
CBA
CAB

答案 1 :(得分:0)

这可以通过使用回溯算法来完成

Algorithm

答案 2 :(得分:0)

您可以尝试使用以下内容:

public static ArrayList<String> combinations = new ArrayList<>();


public static void main(String[] args) {
    char[] letters = {'A', 'B', 'C', 'D', 'E', 'F'};
    computePermutation(letters, 0, letters.length);



    Iterator<String> it = combinations.iterator();
    while(it.hasNext())System.out.println(it.next());
    System.out.println(combinations.size());
}

private static void computePermutation(char[] current, int startIndex, int endIndex) {
    // Base case
    if (startIndex == endIndex) {
        combinations.add(new String(current));
    } else {
        //try to move the swap window from start index to end index
        //i.e 0 to a.length-1
        for (int x = startIndex; x < endIndex; x++) {
            swap(current, startIndex, x);
            computePermutation(current, startIndex + 1, endIndex);
            swap(current, startIndex, x);
        }
    }
}

private static void swap(char[] a, int i, int x) {
    char t = a[i];
    a[i] = a[x];
    a[x] = t;
}

另请参阅StackOverflow中的这个问题,因为它几乎完全相同: full reproduction

答案 3 :(得分:0)

在python中,我们可以使用itertools.permutations()来解决这个问题。

>>> import itertools
>>> x = itertools.permutations([1,2,3])
>>> for i in x:
       print i

结果如下。

(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)