Leetcode 第17题: Letter Combinations of a Phone Number--电话号码的字母组合(C++、Python)

题目地址: Letter Combinations of a Phone Number


题目简介:

给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。

                                                                            Leetcode 第17题: Letter Combinations of a Phone Number--电话号码的字母组合(C++、Python)_第1张图片

Example:

Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

 

题目解析:广度搜索(BFS)

当拿到给定的字符串后,一般会有两种方法得到结果。

  1. 深度搜索:尽可能先找到一个合适的字符组合,把它放在vector中,然后再回来找下一个符合的字符组合;
  2. 广度搜索:对每一个数字可以添加的字符都添加到后面;

为了清晰的理解上述两种说法,将上面的例子进行说明:

  1. 深度搜索:“23”的一个数字为“2”,“2”对应的第一个字符为“a”。然后便考虑“3”的第一个字符“d”,因为"3"后没有字符了,便结合起来得到第一个字符组合“ad”。考虑“3”的第二个字符“e”,于是得到了第二个字符组合“ae”。反复循环,得到所有字符组合,有点不到南墙不回头的意思。
  2. 广度搜索:“23”的一个数字为“2”,“2”有三个字符“a”,“b”,“c”,先存起来。考虑第二个数字“3”,有三个字符“d”,“e”,“f”,然后两两组合得到结果。

                                                                Leetcode 第17题: Letter Combinations of a Phone Number--电话号码的字母组合(C++、Python)_第2张图片

上图说明了连接的过程。


C++版(BFS):

class Solution {
public:
    vector divideLetter(string s, vector temp){
        if (s.length() == 0) //如果已经匹配完成直接返回
            return temp;

        string keyboard[] = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

        vector ans;
        int num = s[0] - '2';//这样得到的结果直接忽略掉了"1"和"0",根本没有他们的位置
        for (int i = 0; i < temp.size();i++)
        {
            string load = temp[i];
            if (num == 5 || num == 7) //这里对应键盘的“7”和“9”键盘
            {
                for (int j = 0; j < 4; j++)
                {
                    ans.push_back(load + keyboard[num][j]);
                }
            }
            else //这里对应其他的几个键盘
            {
                for (int j = 0; j < 3; j++)
                {
                    ans.push_back(load + keyboard[num][j]);
                }
            }
        }
        s.erase(s.begin()); //当前的数字已经发挥完成它的作用
        return divideLetter(s, ans); //递归下去
    }
    vector letterCombinations(string digits) {
        vector ans;
        if (digits.length() == 0) //如果长度为0,直接返回空的vector
            return ans;
        ans.push_back(""); //放进去这个空字符串的防止第一次往vector放字符的时候没有办法接受
        return divideLetter(digits,ans);
    }
};

 

 


Python版:

 

class Solution:
    def divideLetter(self, s, temp):
        if (len(s) == 0):
            return temp
        
        keyboard = ['abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
        num = int(s[0]) - int('2')
        ans = []
        for i in range(len(temp)):
            load = temp[i]
            if (num == 5 or num == 7):
                for j in range(4):
                    ans.append(load + keyboard[num][j])
            else:
                for j in range(3):
                    ans.append(load + keyboard[num][j])
                    
        return self.divideLetter(s[1:len(s)], ans)
        
    def letterCombinations(self, digits: str) -> List[str]:
        ans = []
        if (len(digits) == 0):
            return ans
        ans.append("")
        return self.divideLetter(digits,ans)

 

你可能感兴趣的:(leetcode)