Leetcode17

Letter Combinations of a Phone Number:
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.
在这里插入图片描述
Example:
Input: “23”
Output: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.

Solution:

#include <iostream>
#include <vector>

using namespace std;

class Solution {

private:
    const string lettermap[10] = {
            " ",    //0
            "",     //1
            "abc",  //2
            "def",  //3
            "ghi",  //4
            "jkl",  //5
            "mno",  //6
            "pqrs", //7
            "tuv",  //8
            "wxyz"  //9
    };

    vector<string> res;

    // s中保存了此时从digits[0...index-1]翻译得到的一个字母字符串
    // 寻找和digits[index]匹配的字母,获得digits[0...index]翻译得到的解
    void findCombination(const string &digits, int index, const string &s){

        if ( index == digits.size()){
            // 保存s
            res.push_back(s);
            return;
        }
        char c = digits[index];
        assert( c >= '0' && c <= '9' && c != '1');
        string letters = lettermap[c - '0'];
        for ( int i = 0; i < letters.size(); i++)
            findCombination( digits, index + 1, s + letters[i]);

        return;
    }

public:
    vector<string> letterCombinations(string digits) {

        res.clear();
        if ( digits == "")
            return res;

        findCombination(digits, 0, "");

        return res;

    }
};

总结: 仔细分析可以把此问题归为树形问题,如图:
在这里插入图片描述
想到要用递归的思想。要好好体会代码!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值