题目(LeetCode #1087)
花括号展开
给定一个表示单词列表的字符串 s 。单词中的每个字母都有一个或多个选项。
- 如果有一个选项,则字母按原样表示。
 
- 如果有多个选项,则用大括号分隔选项。例如, 
"{a,b,c}" 表示选项 ["a", "b", "c"] 。 
例如,如果 s = "a{b,c}" ,第一个字符总是 'a' ,但第二个字符可以是 'b' 或 'c' 。原来的列表是 ["ab", "ac"] 。
请你 按字典顺序 ,返回所有以这种方式形成的单词。
示例1:
输入:s = “{a,b}c{d,e}f”
输出:[“acdf”,”acef”,”bcdf”,”bcef”]
示例2:
输入:s = “abcd”
输出:[“abcd”]
提示:
1 <= S.length <= 50 
s 由括号 '{}' , ',' 和小写英文字母组成。 
s 保证是一个有效的输入。 
- 没有嵌套的大括号。
 
- 在一对连续的左括号和右括号内的所有字符都是不同的。
 
题解
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
   | class Solution {     private char[] sArr;     private List<String> result;      private StringBuilder builder;
      public String[] expand(String s) {         sArr = s.toCharArray();         result = new ArrayList<>();         builder = new StringBuilder();
          dfs(0);
          Collections.sort(result);         return result.toArray(new String[0]);     }
      private void dfs(int idx) {         if (idx == sArr.length) {             result.add(builder.toString());             return;         }
          if (sArr[idx] == '{') {             int rIdx = ++idx;             while (rIdx < sArr.length && sArr[rIdx] != '}') rIdx++;
              for (int i = idx; i < rIdx; i++) {                 if (sArr[i] == ',') continue;                 builder.append(sArr[i]);                 dfs(rIdx + 1);                 builder.deleteCharAt(builder.length() - 1);             }         } else {             builder.append(sArr[idx]);             dfs(idx + 1);             builder.deleteCharAt(builder.length() - 1);         }     } }
  |