题目:

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"].

Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.

代码:

class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> ret;
if ( digits.empty() ) return ret;
map<int, string> digitLetters;
digitLetters[] = "";
digitLetters[] = "";
digitLetters[] = "abc";
digitLetters[] = "def";
digitLetters[] = "ghi";
digitLetters[] = "jkl";
digitLetters[] = "mno";
digitLetters[] = "pqrs";
digitLetters[] = "tuv";
digitLetters[] = "wxyz";
vector<int> letterBegin(,);
int index = ;
string tmp;
Solution::combine(ret, tmp, index, digits, digitLetters, letterBegin);
return ret;
}
static void combine(
vector<string>& ret,
string& tmp,
int index,
string& digits,
map<int,string>& digitLetters,
vector<int>& letterBegin)
{
if (index==digits.size())
{
ret.push_back(tmp);
return;
}
int curr = digits[index]-'';
string letters = digitLetters[curr];
for ( int i = ; i < letters.size(); ++i )
{
letterBegin[curr] = i;
tmp.push_back(letters[i]);
Solution::combine(ret, tmp, index+, digits, digitLetters, letterBegin);
tmp.erase(tmp.end()-);
}
}
};

tips:

上述的代码是AC的。思路也就是常规dfs的思路:

1. 终止条件是层级到了digits的长度

2. 每一层递归相当于根据该位置的数字选一个字母

但是,个人感觉这道题的题干要求没说清楚;既然是letter combinations,而不是letter permutation,那么“ac”和“ca”就应该算一个combination,但是OJ之后发现默认“ac”和“ca”算两个。加入“ac”和“ca”算一个,有没有解法呢?代码如下:

class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> ret;
if ( digits.empty() ) return ret;
map<int, string> digitLetters;
digitLetters[] = "";
digitLetters[] = "";
digitLetters[] = "abc";
digitLetters[] = "def";
digitLetters[] = "ghi";
digitLetters[] = "jkl";
digitLetters[] = "mno";
digitLetters[] = "pqrs";
digitLetters[] = "tuv";
digitLetters[] = "wxyz";
vector<int> letterBegin(,);
int index = ;
string tmp;
Solution::combine(ret, tmp, index, digits, digitLetters, letterBegin);
return ret;
}
static void combine(
vector<string>& ret,
string& tmp,
int index,
string& digits,
map<int,string>& digitLetters,
vector<int>& letterBegin)
{
if (index==digits.size())
{
ret.push_back(tmp);
return;
}
int curr = digits[index]-'';
string letters = digitLetters[curr];
for ( int i = letterBegin[curr]; i < letters.size(); ++i )
{
letterBegin[curr] = i;
tmp.push_back(letters[i]);
Solution::combine(ret, tmp, index+, digits, digitLetters, letterBegin);
tmp.erase(tmp.end()-);
}
}
};

tips:

多维护一个letterBegin的数组,标记“当前的组合中,某个数字对应的字母序列中应该从第几个字母开始取”。

如果输入是“22”,那么给出的解集就是:

aa

ab

ac

bb

bc

cc

从这个例子可以看出来,算法的原理就是维护某一个数字对应字母序列:如果数字重复出现,那么对应的字母要保证字典序递增,这样就不会用重复的。

可惜题目并不是这么要求的。

===============================================

既然题目要求简单了,则再追求一个迭代的解法。AC的代码如下:

class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> ret;
if (digits.empty()) return ret;
ret.push_back("");
map<int, string> digitLetters;
digitLetters[] = "abc";
digitLetters[] = "def";
digitLetters[] = "ghi";
digitLetters[] = "jkl";
digitLetters[] = "mno";
digitLetters[] = "pqrs";
digitLetters[] = "tuv";
digitLetters[] = "wxyz";
for ( size_t i = ; i < digits.size(); ++i )
{
int curr = digits[i]-'';
string letters = digitLetters.find(curr)==digitLetters.end() ? "" : digitLetters[curr];
vector<string> tmp = ret;
ret.clear();
for ( size_t j = ; j < tmp.size(); ++j )
{
for ( size_t k = ; k < letters.size(); ++k )
{
string ori = tmp[j];
ori += letters[k];
ret.push_back(ori);
}
}
}
return ret;
}
};

完毕。

======================================

第二次过这道题,用dfs过的。注意如果原来的digits==""返回的也是空。

class Solution {
public:
vector<string> letterCombinations(string digits)
{
map<char, string> digit_letters;
digit_letters[''] = "abc";
digit_letters[''] = "def";
digit_letters[''] = "ghi";
digit_letters[''] = "jkl";
digit_letters[''] = "mno";
digit_letters[''] = "pqrs";
digit_letters[''] = "tuv";
digit_letters[''] = "wxyz";
vector<string> ret;
if ( digits=="" ) return ret;
vector<char> tmp;
Solution::dfs(ret, digits, tmp, digit_letters);
return ret;
}
static void dfs(
vector<string>& ret,
string digits,
vector<char>& tmp,
map<char,string>& digit_letters)
{
if ( tmp.size()==digits.size() )
{
ret.push_back(string(tmp.begin(),tmp.end()));
return;
}
int index = tmp.size();
for ( int i=; i<digit_letters[digits[index]].size(); ++i )
{
tmp.push_back(digit_letters[digits[index]][i]);
Solution::dfs(ret, digits, tmp, digit_letters);
tmp.pop_back();
}
}
};

【Letter Combinations of a Phone Number】cpp的更多相关文章

  1. 【leetcode】Letter Combinations of a Phone Number

    Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations ...

  2. Leetcode之回溯法专题-17. 电话号码的字母组合(Letter Combinations of a Phone Number)

    [Leetcode]17. 电话号码的字母组合(Letter Combinations of a Phone Number) 题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组 ...

  3. [LintCode] Letter Combinations of a Phone Number 电话号码的字母组合

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  4. 69. Letter Combinations of a Phone Number

    Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations ...

  5. [LeetCode][Python]17: Letter Combinations of a Phone Number

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 17: Letter Combinations of a Phone Numb ...

  6. Letter Combinations of a Phone Number:深度优先和广度优先两种解法

    Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations ...

  7. leetcode-algorithms-17 Letter Combinations of a Phone Number

    leetcode-algorithms-17 Letter Combinations of a Phone Number Given a string containing digits from 2 ...

  8. 《LeetBook》leetcode题解(17):Letter Combinations of a Phone Number[M]

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  9. Letter Combinations of a Phone Number - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Letter Combinations of a Phone Number - LeetCode 注意点 可以不用按字典序排序 解法 解法一:输入的数字逐 ...

随机推荐

  1. FreeBSD 安裝 wget

    cd /usr/ports/ftp/wgetmake install clean pkg_add -r wget就可以把wget安装上去了

  2. 杭电acm刷题顺序

    最近兴趣来了,闲暇之余,回顾大学期间刷过的杭电acm那些入门级别的题,以此巩固基础知识! 以下参考刷题顺序,避免入坑 原文传送门:https://blog.csdn.net/liuqiyao_01/a ...

  3. 实战:ADFS3.0单点登录系列-ADFS3.0安装配置

    本文为系列第三章,主要讲下ADFS3.0的安装和配置.本文和前面的文章是一个系列,因此有些地方是有前后关联,比如本文中使用的通配符证书就是第二篇讲解的,因此需要连贯的进行阅读. 全文目录如下: 实战: ...

  4. PHP与MYSQL结合操作——文章发布系统小项目(实现基本增删查改操作)

    php和mysql在一起几十年了,也是一对老夫老妻了,最近正在对他们的爱情故事进行探讨,并做了一个很简单的小东西——文章发布系统,目的是为了实现mysql对文章的基本增删查改操作 前台展示系统有:文章 ...

  5. 300行ABAP代码实现一个最简单的区块链原型

    不知从什么时候起,区块链在网上一下子就火了. 这里Jerry就不班门弄斧了,网上有太多的区块链介绍文章.我的这篇文章没有任何高大上的术语,就是300行ABAP代码,实现一个最简单的区块链原型. 我个人 ...

  6. 【洛谷4252】[NOI2006] 聪明的导游(提答题)

    点此看题面 大致题意: 给你一张\(n\)个点.\(m\)条边的无向图,让你找出图上的一条不经过重复节点的最长路(提答+\(spj\)). 随机化乱搞 针对这种提答题,我们就要用随机化乱搞(Cptra ...

  7. Problem L: 搜索基础之马走日

    Problem L: 搜索基础之马走日 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 134  Solved: 91[Submit][Status][W ...

  8. @TransactionConfiguration过时与替代写法

    在使用了Spring的项目中做单元测试时,以前的标准写法是这样的: 但是在高版本的Spring框架中(Spring4.2以后),@TransactionConfiguration已经标注为过时的注解, ...

  9. 深入理解React虚拟DOM

    一.什么是虚拟DOM 虚拟DOM可以看做一棵模拟了DOM树的JavaScript对象树.比如: var element = { element: 'ul', props: { id:"uli ...

  10. JQuery根据关键字检索html元素并筛选显示

    背景:标题比较唬人,实际上就是在文本框中输入关键字,通过关键字检索html元素,筛选后显示在界面上. Html元素如下: <div> <input type="text&q ...