gpt4 book ai didi

java - 插入加号时查找数字的所有组合

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:12:32 25 4
gpt4 key购买 nike

我正在研究练习算法题,似乎无法解决这道题。我给出了一个数字,例如 1234。在向其中添加 + 符号时,我需要找到数字的不同组合。答案中可以有多个加号。所以结果看起来像 1+2341+2+3412+34 等。我知道如何找到不同的子字符串,但是不是如何将它们加起来。这是我所拥有的:

public static void findCombos(String string){
List<String> substrings = new ArrayList<>();
for( int i = 0 ; i < string.length() ; i++ )
{
for( int j = 1 ; j <= string.length() - i ; j++ )
{
String sub = string.substring(i, i+j);
substrings.add(sub);
}
}
System.out.println(substrings);
}

如果将数字转换为字符串,这只会存储不同的子字符串。我将如何将它们放在一起以创建正确的字符串。我在考虑带前缀的递归,但做不对。

这与排列问题不同,因为我被要求保持数字的顺序不变,但要添加 +

最佳答案

您想生成参数 arg 的所有可能划分。参数 arg 可以拆分为 arg.length - 1 点。在这里,我使用 boolean 数组 (divisors[N]) 来记住您是否要在字符 arg[N]arg[N + 1] 之间进行拆分)。divisors 数组的所有可能版本都在递归流程中生成 - 当您到达末尾时,您将执行字符串除法并保存结果。

public static void cover(final String arg) {
final List<Set<String>> result = new ArrayList<>();

final boolean[] divisors = new boolean[arg.length() - 1];
processDivisors(divisors, 0, arg, result);

System.out.println(result);
// now the result contains the divisions, we can do something with it
doSomethingWithResult(result);
}

private static void processDivisors(final boolean[] divisors,
final int position,
final String arg,
/* out */ final List<Set<String>> result) {

if (position == arg.length() - 1) {
final Set<String> computedDivision = computeDivision(arg, divisors);
result.add(computedDivision);
return;
}
divisors[position] = true;
processDivisors(divisors, position + 1, arg, result);
divisors[position] = false;
processDivisors(divisors, position + 1, arg, result);
}

private static Set<String> computeDivision(final String arg, final boolean[] divisors) {
final Set<String> computedDivision = new TreeSet<>();
int start = 0;
for (int i = 0; i < divisors.length; ++i) {
if (divisors[i]) {
computedDivision.add(arg.substring(start, i + 1));
start = i + 1;
}
}
computedDivision.add(arg.substring(start, arg.length()));
return computedDivision;
}

private static void doSomethingWithResult(final List<Set<String>> result) {
for (final Set<String> coverage : result) {
final String message = String.join("+", coverage);
System.out.println(message);
}
}

我坚信这段代码并不完美,可以以某种方式进行优化。顺便提一句。如果在做除法的时候需要做额外的操作,可以修改computeDivison方法。但肯定不会将该部分用于打印 - 更明智的做法是先生成输出,然后在不同的代码段中进行处理。

关于java - 插入加号时查找数字的所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46519586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com