leetcode:17. Letter Combinations of a Phone Number

来源:互联网 发布:好看的搞笑网络短剧 编辑:程序博客网 时间:2024/05/17 22:05

描述

Given a digit string, 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.

这里写图片描述

Input:Digit string “23”
Output: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].

思路

思路比较简单,就是不断做笛卡尔积。

代码

class Solution {public:    vector<string> letterCombinations(string digits) {        vector<string> combineVec;        if(digits.empty()) return combineVec;         static const string letterMap[] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};        combineVec.push_back("");        int index;        for(int i = 0; i < digits.size(); i++){            index = digits[i] - '0';            if(index < 2 || index > 9) continue;            vector<string> temp;             const string& letterMapValue = letterMap[index];            for(int j = 0; j < combineVec.size();j++){                for(int k = 0; k < letterMapValue.size(); k++){                    temp.push_back(combineVec[j] + letterMapValue[k]);                }            }            combineVec=temp;        }        return combineVec;    }};

结果

他山之玉

C++ O(n) solutioin

vector<string> letterCombinations(string digits) {    vector<string> result;    if(digits.empty()) return vector<string>();    static const vector<string> v = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};    result.push_back("");   // add a seed for the initial case    for(int i = 0 ; i < digits.size(); ++i) {        int num = digits[i]-'0';        if(num < 0 || num > 9) break;        const string& candidate = v[num];        if(candidate.empty()) continue;        vector<string> tmp;        for(int j = 0 ; j < candidate.size() ; ++j) {            for(int k = 0 ; k < result.size() ; ++k) {                tmp.push_back(result[k] + candidate[j]);            }        }        result.swap(tmp);    }    return result;}

在第二句的时候,我用的是digits.size()来判断是否为空,结果时间差了2ms。这个地方下次要注意了。

Java O(n) solution

public class Solution {    public List<String> letterCombinations(String digits) {        List<String> list = new ArrayList<>();        if (digits == null || digits.trim().length() == 0) return list;        String[] str = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};        char[] ch = digits.trim().toCharArray();        int sum = 1;        String [] arr = new String[ch.length];        for (int i = 0; i < ch.length; i++) {           arr[i] = str[ch[i] - '0'];        }        list = new ArrayList<>(sum);       return  combination(arr, list, 0, "");    }    private List<String> combination(String[] s, List<String> list, int index, String result) {        if (result.length() == s.length) {            list.add(result);            return list;        }        for (int i = index; i < s.length; i++) {            for (int j = 0; j < s[i].length(); j++) {               combination(s,list, i + 1, result + s[i].substring(j, j + 1));            }        }        return list;     }

这个是利用递归来做的笛卡尔积。

python O(n) solution

class Solution:    # @return a list of strings, [s1, s2]    def letterCombinations(self, digits):        # define a dictionary of the character <-> number projection        pad = {'2':'abc', '3':'def', '4':'ghi', '5':'jkl', '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'}        # if the input is empty        if len(digits) == 0:            return [""]        # for number string length equals n-1            d0 = digits[:-1]        comb0 = self.letterCombinations(d0)        # combine the last digit with previous n-1 string        d1 = digits[-1]        string1 = pad[d1]        comb1 = []        #  consider every combinations        for s in string1:            for c in comb0:                cs = c+s                comb1.append(cs)        return comb1

反思

先写出来,再优化

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玩守望先锋人物模型没刷出来怎么办 不小心点击拔打黑客lD视频怎么办 套得太深散户都不卖庄家怎么办 黑色衣领掉色在白衣服上怎么办 电脑缝纫界下线切的短怎么办 喝完酒第二天恶心想吐怎么办 纸上怎么办画5种标准眉 电脑密码忘了怎么办最简单的方法 宿舍六个人有一个不想安空调怎么办 绝地求生开在了进游戏的页面怎么办 桃树树根有很大一个洞怎么办啊 截掉的枝干一直往下干怎么办 大佛肚竹的叶子都黄了怎么办 大佛肚竹的枝和叶都掉了怎么办 网吧锁屏后但我的页面没关怎么办 不干了公司把我东西扔了怎么办 竹子种了3个月也不发芽是怎么办 盆栽橘子树夏季叶子全掉了怎么办 盆栽藕叶子全干了是怎么办 家里的盆栽竹根部长霉怎么办 浅色衣服被蓝彩笔染上色怎么办 pr导出视频后显示素材丢失怎么办 ps抠下来的图边缘发白怎么办 ps中抠出的图边缘虚不圆滑怎么办 ps的文字工具多了圆框怎么办 苹果6s屏幕锁忘了密码怎么办 网上下载的3d模型渲染很慢怎么办 cad下载完成后出现闪退怎么办 婴儿在肚子里被系带绑到怎么办 我想给外地的朋友送花怎么办 英雄联盟连接不上聊天服务器怎么办 用黄金换玫瑰金后悔了怎么办 劳力士日志系列玫瑰金和黄金怎么办 香菇代进地注水后长满绿毛怎么办 群主给你带了不满意的头衘怎么办 普兰德雪地靴洗变色了怎么办 书被水泡了皱了黏了怎么办 书被水泡了皱了没干怎么办 眼皮干燥起皮起皱怎么办能治好吗 手指头起小水泡指甲不平整怎么办 这几天我的内裤上带点血丝怎么办