原題連接在這裏:https://leetcode.com/problems/brace-expansion/html
題目:app
A string S
represents a list of words.curl
Each letter in the word has 1 or more options. If there is one option, the letter is represented as is. If there is more than one option, then curly braces delimit the options. For example, "{a,b,c}"
represents options ["a", "b", "c"]
.ide
For example, "{a,b,c}d{e,f}"
represents the list ["ade", "adf", "bde", "bdf", "cde", "cdf"]
.post
Return all words that can be formed in this manner, in lexicographical order.ui
Example 1:this
Input: "{a,b}c{d,e}f"
Output: ["acdf","acef","bcdf","bcef"]
Example 2:url
Input: "abcd"
Output: ["abcd"]
Note:spa
1 <= S.length <= 50
題解:code
If there is curly braces, all the chars in it could be candidate.
Starting from index 0. Do DFS, DFS state needs orginal string, current index, current StringBuilder and res collection.
If current index i points to '{', then find next index j points to '}', for each of candidate inside brances, append it to StringBuilder and continue DFS at index j+1. After DFS, do backtracking.
If current index i points to char, append it to StringBuilder and continue DFS at index i+1. After DFS, do bracktracking.
When current index points to the end of string, add copy of StringBuilder to res collection.
Time Complexity: exponential.
Space: O(n). n = S.length(). stack space.
AC Java:
1 class Solution { 2 public String[] expand(String S) { 3 if(S == null || S.length() == 0){ 4 return new String[0]; 5 } 6 7 List<String> res = new ArrayList<String>(); 8 dfs(S, 0, new StringBuilder(), res); 9 Collections.sort(res); 10 return res.toArray(new String[0]); 11 } 12 13 private void dfs(String s, int i, StringBuilder sb, List<String> res){ 14 if(i >= s.length()){ 15 res.add(sb.toString()); 16 return; 17 } 18 19 20 if(s.charAt(i) == '{'){ 21 int j = i+1; 22 while(j<s.length() && s.charAt(j)!='}'){ 23 j++; 24 } 25 26 String [] candidates = s.substring(i+1, j).split(","); 27 for(String candidate : candidates){ 28 sb.append(candidate); 29 dfs(s, j+1, sb, res); 30 sb.deleteCharAt(sb.length()-1); 31 } 32 }else{ 33 sb.append(s.charAt(i)); 34 dfs(s, i+1, sb, res); 35 sb.deleteCharAt(sb.length()-1); 36 } 37 } 38 }