1087. Brace Expansion - Medium

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.

 

classical dfs

time = O(2^n), n -- # of pair of braces, space = O(n)

class Solution {
    public String[] expand(String S) {
        if(S == null || S.length() == 0) {
            return new String[0];
        }
        List<String> list = new ArrayList<>();
        
        dfs(S, 0, new StringBuilder(), list);
        
        String[] res = new String[list.size()];
        for(int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        return res;
    }
    
    public void dfs(String s, int idx, StringBuilder sb, List<String> list) {
        if(idx == s.length()) {
            list.add(sb.toString());
            return;
        }
        int len = sb.length();
        
        if(s.charAt(idx) == '{') {
            List<Character> tmp = new ArrayList<>();
            int end = idx + 1;
            while(end < s.length() && s.charAt(end) != '}') {
                if(Character.isLetter(s.charAt(end))) {
                    tmp.add(s.charAt(end));
                }
                end++;
            }
            Collections.sort(tmp);
            for(char c : tmp) {
                sb.append(c);
                dfs(s, end + 1, sb, list);
                sb.setLength(len);
            }
        } else if(Character.isLetter(s.charAt(idx))) {
            sb.append(s.charAt(idx));
            dfs(s, idx + 1, sb, list);
        }
    }
}

 

转载于:https://www.cnblogs.com/fatttcat/p/11220154.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值