给定整数的字符串的Java排列

时间:2014-06-02 13:41:22

标签: java arrays string integer permutation

我试图在给定整数的字符串的java中进行排列。

所以如果String是" abc"整数是2。

我想要以下结果:

AB AC BA 公元前 CA CB

如果字符串也是" abc"但整数是3,我想得到以下结果:

ABC BAC CBA BCA 出租车 ACB

我已经有以下方法:

private static void permutation(String prefix, String str) {
        int n = str.length();
        if (n == 0) permutationsList.add(prefix);
        else {
            for (int i = 0; i < n; i++)
                permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n));
        }
    }

但这仅适用于整数等于字符串大小,在本例中为3。

通过Integer参数,有什么能帮助我完成这项工作吗?

提前多多谢谢;)

2 个答案:

答案 0 :(得分:1)

对数据集进行排列的最佳方法之一是应用DFS,它有助于完成指定长度的所有组合。

以下是我的问题解决方案:

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

/**
 * @author mifmif
 * 
 */
public class DFS {

    /**
     * list of generated combination
     */
    List<String> permutations = new ArrayList<String>();
    /**
     * input used to generate combination
     */
    String input = "ABCDEF";
    /**
     * the length of the combination
     */
    int conbinationSize = 3;
    /**
     * isChoosed[i] is true if the combination that is currently prepared
     * contain index.charAt(i)
     */
    boolean[] isChoosed = new boolean[input.length()];

    /**
     * the DFS method that will generate all possible combination
     * 
     * @param partialOutput
     */
    public void generateCombination(String partialOutput) {
        if (partialOutput.length() == conbinationSize) {
            permutations.add(partialOutput);
            return;
        }
        for (int i = 0; i < input.length(); ++i) {
            if (!isChoosed[i]) {
                isChoosed[i] = true;
                generateCombination(partialOutput + input.charAt(i));
                isChoosed[i] = false;
            }
        }

    }

    void printCombination() {
        for (String c : permutations) {
            System.out.println(c);
        }
    }

    public static void main(String[] args) {
        DFS dfs = new DFS();
        dfs.generateCombination("");
        dfs.printCombination();
    }
}

答案 1 :(得分:0)

从IDE /编辑器中退一步,考虑如何在更高级别的伪代码中解决此问题。

如果字符串的长度为零或整数k为零,会发生什么? 如果k等于字符串的长度,你如何得到排列?如果您的字符串为'ABC',则可以通过查找'A'的所有排列并将其中的每一个附加到字母'BC'来获得从'A'开始的所有排列。那么现在发生了什么,以便从'ABC''B'开始获得'C'的排列?

最后,如果k小于字符串的长度,请问自己在何种步骤停止该过程。

一些伪代码:

perms(string, k)
    if length(string) == 0 or k == 0
         // do what?
    else
       for every character in string
           for every sub-permutation in perms(*some modified string*, *some modified k-value*)
                // the permutation is character + sub-permutation