[英]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.