【leetcode】1087 字母切换(回溯)

本文介绍了LeetCode第1087题——字母切换的解题方法,包括两种策略:迭代和回溯。通过解析题目描述,理解每个字母可能存在的选项,当遇到花括号时,表示字母有多种选择。题目要求返回所有可能的单词列表,按字典序排列。示例展示了具体的应用情况,并提示没有嵌套的花括号且一对花括号间字母不同。
摘要由CSDN通过智能技术生成

题目链接:https://leetcode-cn.com/problems/brace-expansion/

题目描述

我们用一个特殊的字符串 S 来表示一份单词列表,之所以能展开成为一个列表,是因为这个字符串 S 中存在一个叫做「选项」的概念:

单词中的每个字母可能只有一个选项或存在多个备选项。如果只有一个选项,那么该字母按原样表示。

如果存在多个选项,就会以花括号包裹来表示这些选项(使它们与其他字母分隔开),例如 "{a,b,c}" 表示 ["a", "b", "c"]

例子:"{a,b,c}d{e,f}" 可以表示单词列表 ["ade", "adf", "bde", "bdf", "cde", "cdf"]

请你按字典顺序,返回所有以这种方式形成的单词。

示例 1:

输入:"{a,b}c{d,e}f"
输出:["acdf","acef","bcdf","bcef"]

示例 2:

输入:"abcd"
输出:["abcd"]

提示:

  1. 1 <= S.length <= 50
  2. 你可以假设题目中不存在嵌套的花括号
  3. 在一对连续的花括号(开花括号与闭花括号)之间的所有字母都不会相同

思路

1 迭代
// 迭代方法
class SolutionI {
public:
    vector<string> expand(string S) {
        vector<string> ret = {""};
        int i = 0;
        while (i < S.size()){
            if(S[i] == '{'){
                i++;
                string cur = "";
                while (i < S.size() && S[i] !='}'){
                    cur += S[i++];
                    if (i < S.size() && S[i] == ',')
                        ++i;
                }
                sort(cur.begin(),cur.end());
                ++i;    // 跳过}
                int num = ret.size();   // 当前组合数
                vector<string> tmp;
                for(int k = 0; k < num;++k){
                    for (int j = 0; j < cur.size(); ++j) {
                        tmp.push_back(ret[k] + cur[j]);
                    }
                }
                ret = tmp;
            }
            else{
                int num = ret.size();
                vector<string> tmp;
                for(int k = 0; k < num;++k){
                    tmp.push_back(ret[k] + S[i]);
                }
                ++i;
                ret = tmp;
            }
        }
        return ret;
    }
};
2 回溯
// 回溯
class Solution {
    vector<string> ret;
public:
    vector<string> expand(string S) {
        dfs(S,0,S.size(),"");
        sort(ret.begin(), ret.end());
        return ret;
    }

private:
    void dfs(string &S, int i, int n, string str){
        if(i >= n){
            ret.push_back(str);
            return;
        }
        else{
            if(S[i]!= '{')
                dfs(S,i+1,n, str+S[i]);
            else{
                string cur;
                ++i;
                while(S[i]!='}'){
                    if(S[i]!=',')
                        cur.push_back(S[i]);
                    ++i;
                }
                ++i;
                for(char ch:cur)
                    dfs(S, i,n, str+ch);

            }
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值