タイトル
リンクします。https://ac.nowcoder.com/acm/contest/3286/C
牛肉ギブだけ含む文字列が9に1秒、あなたは今、「+」を挿入することができます記号は、任意の2つの数字の間に式を構成し、そして今、あなたはすべての式と結果を取得したいです。
NiuNiuは唯一の数字が含まあなたの文字列を与える文字「1」「9」にし、そしてあなたが式を形成するために、任意の2つの文字の間に任意の回数のための「+」を挿入できることを教えてくれ。今、彼はの合計を知りたいですすべての異なった式の結果を形成することができます。
説明入力:
入力文字列Sが唯一の数字が含まれ(1≤| | Sを≤10)
'1' '。9' INPUTのはに(| S |≤101≤)のみを含む文字列Sのための数字です。
説明出力:
出力合計が
。合計を印刷し
、実施例1
输入
125
输出
176
说明
可以得到插入的结果:
125(不插入)
1 + 25 =26
12 + 5= 17
1 + 2 + 5 = 8
所以答案为: 125 + 26 + 17 + 8 = 176。
All the possible formulas:
125 (insert no ‘+’)
1 + 25 = 26
12 + 5 = 17
1 + 2 + 5 = 8
So the answer is 125 + 26 + 17 + 8 = 176.
例2
输入
9999999999
输出
12656242944
DFS後戻り深さ優先アルゴリズム
アイデア:
- 入力文字列を入力し、文字列に変換。
- 再帰的にバックトラック、文字列の連結を有するいずれかの二つの選択肢がある
+
プラス記号、の有無にかかわらず+
プラス記号は、 - 終了条件、ときの文字数最後から二番目の数字に、手が結果のリストの中に、最後の文字を縫い付けます
resultList
。 - 結果のリスト横断
resultList
ストリングにし、に応じて+
プラス符号番号列に分割されて、数字列は、デジタル蓄積に変換することができます。
package backtracking;
import java.util.ArrayList;
import java.util.List;
public class AddPlusSymbol {
public static void main(String[] args) {
AddPlusSymbol obj = new AddPlusSymbol();
String input1 = "125";
Long result1 = obj.addPlus(input1);
System.out.println("input > " + input1 + " ; result > " + result1);
String input2 = "9999999999";
Long result2 = obj.addPlus(input2);
System.out.println("input > " + input2 + " ; result > " + result2);
}
public long addPlus(String input) {
if (input == null || input.length() == 0) {
return 0;
}
long result = 0;
List<String> resultList = new ArrayList<String>();
char[] chars = input.toCharArray();
// dfs
dfs(chars, resultList, "", 0);
// loop list sum
for (String s: resultList) {
String[] nums = s.split("\\+");
for (String n: nums) {
result += Long.parseLong(n);
}
}
return result;
}
private void dfs(char[] chars, List<String> resultList, String s, int start) {
// exit
if (start == chars.length - 1) {
resultList.add(s + chars[chars.length - 1]);
return;
}
s += chars[start];
dfs(chars, resultList, s + '+', start + 1);
dfs(chars, resultList, s, start + 1);
}
}