簡體   English   中英

插入加號時查找數字的所有組合

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM