【Letter Combinations of a Phone Number】cpp
题目:
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的更多相关文章
- 【leetcode】Letter Combinations of a Phone Number
Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations ...
- Leetcode之回溯法专题-17. 电话号码的字母组合(Letter Combinations of a Phone Number)
[Leetcode]17. 电话号码的字母组合(Letter Combinations of a Phone Number) 题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组 ...
- [LintCode] Letter Combinations of a Phone Number 电话号码的字母组合
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- 69. Letter Combinations of a Phone Number
Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations ...
- [LeetCode][Python]17: Letter Combinations of a Phone Number
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 17: Letter Combinations of a Phone Numb ...
- Letter Combinations of a Phone Number:深度优先和广度优先两种解法
Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations ...
- 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 ...
- 《LeetBook》leetcode题解(17):Letter Combinations of a Phone Number[M]
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- Letter Combinations of a Phone Number - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Letter Combinations of a Phone Number - LeetCode 注意点 可以不用按字典序排序 解法 解法一:输入的数字逐 ...
随机推荐
- iOS - 协议实现的例子
在实际开发中,协议的应用非常广泛,以下是实际应用的例子. 1.协议的定义: myProtocolDelegate.h // // myProtocolDelegate.h // zlwPlayerAp ...
- 微软AI发布会,集齐六大亮点召唤黑科技!
7月12日,微软合作伙伴大会Inspire在华盛顿特区如火如荼地举行.同一天,在相隔5个时区的伦敦,微软还举办了一场关于人工智能的发布会.这是一场智能技术和情感体验两相交融的科技盛宴,既有黑科技,也有 ...
- Google Authenticator加强ssh安全
一.安装依赖包 软件包可以在这个地址下载:https://pan.baidu.com/s/1r0CmwbtCfNiBqU9rh_TxtA yum -y install pam-devel tar jx ...
- linux 命令——19 find (转)
Linux 下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所 以它的选项也很多,其中大部分选项都值得我们 ...
- noip模拟赛#42
T1:给len=1e5的数字串,操作为将某个位置起始的后缀搬到最前面.求有多少个不重复的比原串大和多少个小. =>maya这铁定可以找出些什么规律来.然后就over 了. =>字符串has ...
- iOS将大文件映射到内存(读取大文件)
http://blog.csdn.net/xyt243135803/article/details/40995759 在<中国区GPS偏移纠正(适用于Google地图)>一文中曾读取一个7 ...
- 【luogu P1983 车站分级】 题解
题目链接:https://www.luogu.org/problemnew/show/P1983 符合了NOIP命题的特点,知识点不难,思维量是有的. step1:把题读进去,理解.得到 非停靠点的等 ...
- 通过cmd查看环境变量名对应的环境变量值
在VS环境中通常要添加路径,不过基本都是按照往上提供的方法添加变量名形如:$(VC_IncludePath),但是如何通过cmd命令找到真正的路径呢 未完待续……
- HTML 5新元素和CSS
Html5 新元素 多媒体元素 video/audio: 格式例子: 属性: canvas元素 Canvas标签定义图形,用于图形的绘制,使用 js来绘图 拖放drag和drop 拖放是一种常见 ...
- {"errmsg":"invalid weapp pagepath hint: [IunP8a07243949]","errcode":40165}微信的坑
使用微信官方文档,发送请求会报错-- pagepath无效! 正确修改-- 将标红的pagepath改成 page与上面相同即可