GuilinDev

Lc1096

05 August 2008

1096 Brace Expansion II

类似shell编程的大括号分层次展开,相同层次的大括号里的元素并行组成字符串,返回组成的字符串总数

DFS - 主要思路分成三种情况 空字符串”“,直接返回空集合 包含平级部分的,如{a},{b}这种形式,求出平级的左右部分的结果分别加入结果 不包含平级部分的,如a{b}{c}这种形式,先将第一对括号前的部分当作前缀,再求剥掉第一对括号的结果和第一对括号后面部分的结果,并将三者拼接

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class Solution {
    public List<String> braceExpansionII(String expression) {
        return expansion(expression).stream().sorted().collect(Collectors.toList());
    }

    public Set<String> expansion(String expression) {
        Set<String> result = new HashSet<>();
        //空串返回空结果
        if ("".equals(expression)) {
            return result;
        } else if (!expression.contains("{")) {
            //不含{},那么直接分割即可
            return Arrays.stream(expression.split(",")).collect(Collectors.toSet());
        } else {
            //pairStart, pairEnd分另表示第一个完整的{}的位置
            int pair = 0, pairStart = -1, pairEnd = -1;
            for (int i = 0; i < expression.length(); i++) {
                if (expression.charAt(i) == '{') {
                    if (pairStart == -1) {
                        pairStart = i;
                    }
                    pair++;
                } else if (expression.charAt(i) == '}') {
                    pair--;
                }
                if (pair == 0) {
                    if (pairStart != - 1 && pairEnd == -1) {
                        pairEnd = i;
                    }
                    //pair==0,即不在某个{}中间,那么可以将表达式分成两段
                    if (expression.charAt(i) == ',') {
                        result.addAll(expansion(expression.substring(0, i)));
                        result.addAll(expansion(expression.substring(i + 1)));
                        return result;
                    }
                }
            }
            //现在剩下的只会是{a{b}{c}} a{b}c {}{}这种形式的了
            String prefix = "";
            //括号起点不为0,说明是a{b}c这种形式
            if (pairStart != 0) {
                prefix = expression.substring(0, pairStart);
            }
            //剥掉第一个的最外层括号
            Set<String> left = expansion(expression.substring(pairStart + 1, pairEnd));
            //求出第一个完整{}后部分
            Set<String> right = expansion(expression.substring(pairEnd + 1));
            //为了方便计算加入空串
            if (left.isEmpty()) {
                left.add("");
            }
            if (right.isEmpty()) {
                right.add("");
            }
            //拼接
            for (String l: left) {
                for (String r: right) {
                    result.add(prefix + l + r);
                }
            }
        }
        return result;
    }
}

BFS - 按照第一个大括号里面的字符来BFS

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
class Solution {
    public List<String> braceExpansionII(String expression) {
        Queue<String> queue = new LinkedList<>();
        queue.add(expression);

        Set<String> res = new HashSet<>();
        StringBuilder sb = new StringBuilder();
        while (!queue.isEmpty()) {
            // 拿到需要处理的表达式
            String exp = queue.poll();

            // 如果表达式中没有 {,则将这个表达式加入结果中
            if (exp.indexOf("{") == -1) {
                res.add(exp);
                continue;
            }

            // 找到表达式中第一对 {}
            int i = 0;
            int left = 0;
            int right = 0;
            while (exp.charAt(i) != '}') {
                if (exp.charAt(i) == '{') left = i;
                i++;
            }
            right = i;

            // 拿到第一对括号中的前面部分 (不包括 {)
            String before = exp.substring(0, left);
            // 拿到第一对括号中的后面部分 (不包括 })
            String after = exp.substring(right + 1);
            // 按照 , 分割第一对括号中的元素 (不包括 {})
            String[] strs = exp.substring(left + 1, right).split(",");

            // 将 before 、 strs 中的每个元素以及 after 拼接成字符串放入到队列中,方便后面处理
            for (String str : strs) {
                sb.setLength(0);
                queue.add(sb.append(before).append(str).append(after).toString());
            }
        }
        // 结果处理
        List<String> ans = new ArrayList<>(res);
        Collections.sort(ans);
        return ans;
    }
}