タイトル文字列を展開

タイトル説明

含む数字、大文字と小文字、及び(中括弧、大括弧、丸括弧を含む)ブラケットの文字列が与えられると、ブラケット即ち、ブラケット及びブラケット内部番号が発生する可能性が、ネストすることができます。

番号は括弧なしで考慮されていない後の場合、以下の規則に従って展開ストリングは、ブラケット対になっていない問題に関係なく、すなわち2A2(b)は考慮されていません。

  • 括弧内の数字は、文字列の繰り返し数を表し、列は、拡張ブラケットを含みません
  • 文字列の逆の展開
1 
2
3
入力ABC2 {DE3 [FG]}

出力gfgfgfedgfgfgfedcba

ソリューション

スタックを用いて算出し、各ので、対応する左括弧を取得するには数に対応する左括弧の前のすべての文字を取得する場合は右括弧は、文字がすべてのスタック後に繰り返されているかどうか、この時点で決定されます。

それは右括弧がない場合は、スタックを指示。

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
輸入 java.util.LinkedList; 
インポート java.util.Scanner;

パブリック クラス { 公共静的ボイドメイン(文字列[]引数) { スキャナスキャナ= 新しいスキャナ(System.in)。 列ライン= scanner.nextLine()。INT LEN = line.length()。 LinkedListは<文字列> stack1 = 新しい LinkedListは<>();







//输出gfgfgfedgfgfgfedcba ためint型 I = 0 ; iがLEN <; Iは++){ 文字列のTEMP = line.charAt(I)+ "" もし")]}" .contains(TEMP)){




//前のカッコ内の(1つの文字を取得する
のStringBuilder DUP = 新新のStringBuilder(); しばらく(!"({[" .Contains(stack1.getFirst())){ dup.insert(0、stack1.removeFirst()); } stack1.removeFirst()。





//この時点で注意ピットは、複数桁の数字がかもしれないので、すべての番号を取得する必要がある
のStringBuilder numstr = 新新のStringBuilder(); しばらく!(Stack1.isEmpty()&& stack1.getFirst()マッチ(。「[0 -9] ")){ numStr.insert(0、stack1.removeFirst()); } int型 NUM = Integer.parseInt(numStr.toString())。





//デジタル(前に再度、繰り返してスタックにプッシュ
StringBuilderのSTR = 新しい新規のStringBuilder(); 一方(NUM> 0){ str.append(DUP); --num; } ためINT = K 0、K <str.length(); K ++){ stack1.addFirst(str.charAt(K)+ ""); } } { stack1.addFirst(TEMP); } } のStringBuilder結果= 新しい新規のStringBuilder(); 一方(Stack1! .isEmpty()){













result.append(stack1.removeFirst())。
}
のSystem.out.println(result.toString())。
}
}

オリジナル:大列  文字列には、トピックを展開します


おすすめ

転載: www.cnblogs.com/petewell/p/11584783.html