JAVA程序设计:花括号展开 II(LeetCode:1096)

如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串。

花括号展开的表达式可以看作一个由 花括号、逗号 和 小写英文字母 组成的字符串,定义下面几条语法规则:

如果只给出单一的元素 x,那么表达式表示的字符串就只有 "x"。R(x) = {x}
例如,表达式 {"a"} 表示字符串 "a"。
而表达式 {"w"} 就表示字符串 "w"。
当两个或多个表达式并列,以逗号分隔时,我们取这些表达式中元素的并集。R({e_1,e_2,...}) = R(e_1) ∪ R(e_2) ∪ ...
例如,表达式 "{a,b,c}" 表示字符串 "a","b","c"。
而表达式 "{{a,b},{b,c}}" 也可以表示字符串 "a","b","c"。
要是两个或多个表达式相接,中间没有隔开时,我们从这些表达式中各取一个元素依次连接形成字符串。R(e_1 + e_2) = {a + b for (a, b) in R(e_1) × R(e_2)}
例如,表达式 "{a,b}{c,d}" 表示字符串 "ac","ad","bc","bd"。
表达式之间允许嵌套,单一元素与表达式的连接也是允许的。
例如,表达式 "a{b,c,d}" 表示字符串 "ab","ac","ad"​​​​​​。
例如,表达式 "a{b,c}}{{d,e}f{g,h}" 可以表示字符串 "abdfg", "abdfh", "abefg", "abefh", "acdfg", "acdfh", "acefg", "acefh"。
给出表示基于给定语法规则的表达式 expression,返回它所表示的所有字符串组成的有序列表。

假如你希望以「集合」的概念了解此题,也可以通过点击 “显示英文描述” 获取详情。

 

示例 1:

输入:"{a,b}{c,{d,e}}"
输出:["ac","ad","ae","bc","bd","be"]
示例 2:

输入:"{{a,z},a{b,c},{ab,z}}"
输出:["a","ab","ac","z"]
解释:输出中 不应 出现重复的组合结果。
 

提示:

1 <= expression.length <= 50
expression[i] 由 '{','}',',' 或小写英文字母组成
给出的表达式 expression 用以表示一组基于题目描述中语法构造的字符串

思路:这种类型的题在LeetCode中出现多次了,一般都是通过递归方法解决,在题解中发现有人用bfs的思想过了这道题,这里存下具体方法代码。

class Solution {
    public List<String> braceExpansionII(String expression) {

        Queue<String> q = new LinkedList<>();

        q.add(expression);

        Set<String> st = new HashSet<>();
        StringBuilder str = new StringBuilder();

        while (!q.isEmpty()) {
            String now = q.poll();
            if (now.indexOf("{") == -1) {
                st.add(now);
                continue;
            }
            int i = 0, l = 0, r = 0;
            while (now.charAt(i) != '}') {
                if (now.charAt(i) == '{') l = i;
                i++;
            }
            r = i;
            String before = now.substring(0, l);
            String after = now.substring(r + 1);
            String[] strs = now.substring(l + 1, r).split(",");

            for (String s : strs) {
                str.delete(0, str.length());
                str.append(before + "" + s + "" + after);
                q.add(str.toString());
            }
        }

        List<String> ans = new ArrayList<>(st);
        Collections.sort(ans);
        return ans;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值