[英]Find all combinations of a number when inserting a plus sign
我正在研究练习算法问题,似乎无法解决这个问题。 我给的数字是1234
。 向其中添加+
符号时,我需要找到数字的不同组合。 答案中可以有多个加号。 因此结果看起来像1+234
1+2+34
12+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
点。 在这里,我使用一个布尔数组( 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
方法。 但是肯定不会使用该部分进行打印-首先生成输出,然后在不同的代码段中进行处理会更明智。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.