本周我正在进行一项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);
}
}
}
答案 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