LeetCode 1087. Brace Expansion

Posted Dylan_Java_NYC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1087. Brace Expansion相关的知识,希望对你有一定的参考价值。

原题链接在这里:https://leetcode.com/problems/brace-expansion/

题目:

A string S represents a list of words.

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"].

For example, "{a,b,c}d{e,f}" represents the list ["ade", "adf", "bde", "bdf", "cde", "cdf"].

Return all words that can be formed in this manner, in lexicographical order.

Example 1:

Input: "{a,b}c{d,e}f"
Output: ["acdf","acef","bcdf","bcef"]

Example 2:

Input: "abcd"
Output: ["abcd"]

Note:

  1. 1 <= S.length <= 50
  2. There are no nested curly brackets.
  3. All characters inside a pair of consecutive opening and ending curly brackets are different.

题解:

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 }

 

以上是关于LeetCode 1087. Brace Expansion的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode-1087 permutation of letters(字母切换)

无法从 '<brace-enclosed initializer list> 转换为

text cp mv - shortcut {,} - Brace扩展

bash之花括号扩展(brace expansion )

正确的线程调用语法?错误:没有匹配的调用 std::thread::thread(<brace-enclosed initializer list>)

错误:没有匹配函数调用 'std::vector<Pet*>::vector(<brace-enclosed initializer list>)'