整数字符串的排列

时间:2017-04-10 18:36:44

标签: java recursion backtracking

本周我正在进行一项Java任务,我们希望使用一个集合来递归地回溯一个字符串,并查找所述字符串的所有排列,最终从字符串中包含的数字开始最大化的int。仅此部分就可以了。问题是我们应该设置这个整数的长度,如int z。

所示

例如,方法maxDigit(“12345”,3)的预期输出将是:543。 你能指出我需要改进代码的地方吗?

干杯。

    /**
 * Returns the maximum possible integer given the string str containing digits, using
 * maximum of n digits. Each digit in str can only be used once.
 **/
static int maxDigit(String str, int z) {
    Set<Integer> result = new TreeSet<>();

    if(str.length() == 0 || z == 0)
        return -1;

    permute("",str,result,z);

    int answer = 0;
    for(int a : result) {
        if(a > answer)
            answer = a;
    }
    return answer;
}

/**
 * Creates a set of permutations in result based on string str with max n digits.
 **/
private static void permute(String acc, String str,Set<Integer> result,int z) {
    int n = str.length();
    if (n == 0)
        result.add(Integer.parseInt(acc));
    else {
        if(!(z < str.length())) {
            for (int i = 0; i < n; i++)
                permute(acc + str.charAt(i), str.substring(0, i) + str.substring(i + 1, n), result, z);
        } else {
            for (int i = 0; i < n - 1; i++)
                permute(acc + str.charAt(i), str.substring(0, i) + str.substring(i + 1, z), result, z);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这似乎有效。你的边缘条件是问题。

private static void permute(String acc, String str,Set<Integer> result,int z) {
    int n = str.length();
    if (acc.length() == z)
        result.add(Integer.parseInt(acc));
    else {
        for (int i = 0; i < n; i++)
            permute(acc + str.charAt(i), str.substring(0, i) + str.substring(i + 1, n), result, z);

    }
}

System.out.println(maxDigit("1234", 2)); 
43