Leetcode系列(1)

一、 电话号码的字母组合

leetcode第17题:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。

 

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

思路:利用BFS的思想逐层向下搜索,遍历给定字符串中的结果。

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        vector<string> res;
        if(digits.length()==0)
        {
            return res;
        }
        res.push_back("");
        map<char,string> findTable={
            {'2',"abc"},{'3',"def"},{'4',"ghi"},
            {'5',"jkl"},{'6',"mno"},{'7',"pqrs"},
            {'8',"tuv"},{'9',"wxyz"}
        };
        for(int i=0;i<digits.length();++i)
        {
            vector<string> temp;
            for(char tab:findTable[digits[i]])
            {
                for(int j=0;j<res.size();++j)
                {
                    temp.push_back(res[j]+tab);
                }
            }
            res=temp;
        }
        return res;
    }
};

二、括号生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

思路:先用左括号,然后使用右括号和左括号匹配。

class Solution {
public:
    vector<string> generateParenthesis(int n) 
    {
        vector<string> res;
	if (n == 0 || n<0)
	{
            return res;
	}
	calcSum(n, n, "", res);
	return res;
    }
    void calcSum(int left, int right, string str, vector<string> &bRes)
    {
        if (right == 0||left>right)
	{
	    return;
	}
	if (left == 0)
	{
	    string tStr = str;
	    for (int i = 0; i<right; ++i)
	    {
	        tStr += ")";
       	    }
	    bRes.push_back(tStr);
       	    return;
	}
	str += "(";
        calcSum(left - 1, right, str, bRes);
	str[str.length() - 1] = ')';
	calcSum(left, right - 1, str, bRes);
      }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值