来自一组(字符阵列)长度n动态编程解的所有可能的长度k(k长度字符串)的排列

时间:2014-12-01 14:37:31

标签: java arrays algorithm dynamic

我正在寻找一种动态编程解决方案,从一组n个唯一字符串中获取k长度的所有排列。

示例:

array = {“A”,“B”,“C”,“D”,“E”,“F”,“G”}; // n = 7 示例排列= {ABC},{ABD},{ABE}等// k = 3

我有一种解决方法,首先生成组合,然后生成该组合的所有可能的排列。可以使用动态编程生成组合,例如使用DP解决二项式系数问题。

思考?

1 个答案:

答案 0 :(得分:0)

这是一个开始。这将打印所有可能的组合。我会让你在排列部分工作。请记住,这并不包括记忆。可能存在重复的递归调用。你应该进一步调查(我不想解决你的整个家庭作业)。

// The main function that prints all combinations of size r
// in arr[] of size n. This function mainly uses combinationUtil()
void printCombination(String arr[], int n, int r)
{
    // A temporary array to store all combination one by one
    String[] data = new String[r];

    // Print all combination using temprary array 'data[]'
    combinationUtil(arr, data, 0, n-1, 0, r);
}

/* arr[]  ---> Input Array
data[] ---> Temporary array to store current combination
 start & end ---> Staring and Ending indexes in arr[]
index  ---> Current index in data[]
r ---> Size of a combination to be printed */
void combinationUtil(String arr[], String data[], int start, int end, int index, int r)
{
    // Current combination is ready to be printed, print it
    if (index == r)
    {
        for (int j=0; j<r; j++)
            System.out.printf("%s ", data[j]);
        System.out.printf("\n");
        return;
    }

    // replace index with all possible elements. The condition
    // "end-i+1 >= r-index" makes sure that including one element
    // at index will make a combination with remaining elements
    // at remaining positions
    for (int i=start; i<=end && end-i+1 >= r-index; i++)
    {
        data[index] = arr[i];
        combinationUtil(arr, data, i+1, end, index+1, r);
    }
}

Run this code here