题目:九键字母组合
在手机九键里按下某几个数字会得到哪些字母组合?
例如,按下“23”的可能字母组合有9种 : ad ae af bd be bf cd ce cf
请按字典序输出所有的组合情况
输入
第一行输入N 代表输入的数字个数(1 ≤ N ≤ 4)
第二行N个数字,每个数字在2~9之间,每两个数字之间空格隔开
输出
按字典序输出全部可能的字母组合,每个可能的组合占一行
示例
输入:
2
3 2
输出:
da
db
dc
ea
eb
ec
fa
fb
fc
- 分析思路:
2:abc
3:def
23:ad,ae,af,bc,bd,bf,cd,ce,cf(从每个数字对应的字母中各选一个组合)
递归方法:
一个字母一个字母去搜,每一次枚举当前数字对应字母中选择哪一个,然后加到字符串的后面
循环的方法:
第一层:循环当前枚举哪些数字
state字符串集合:表示前面所有数字组成的所有组合
循环1:c:当前数字的所有备选字母
循环2:s:state 中的所有字符串
枚举当前字符串后面添加哪个字母
每次循环把c拼接在s后面
再把s+到新集合中
字符串集合:state={“”} //空字符串
for 每个数字
for c 当前数字的所有备选字母
for s =state 中的所有字符串
s+=c
将s加到新的集合中
例如:
23
state:{“”}
for 2:
for 枚举a,b,c
for " " //一开始空字符串
"a","b","c"
state1={"a","b","c"}
for 3:
for枚举 d e f
枚举state1:for "a","b","c"
//分别循环三个字符串时,进行拼接
拼接:"ad","bd",“cd”,“ae”,“be”,“ce”,“af”,“bf”,“cf”
state2={"ad","bd",“cd”,“ae”,“be”,“ce”,“af”,“bf”,“cf”}
- 代码:
class Solution{
public:
string chars[8]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
vector<string> letterCombinations(string digits){
if(digits.empty()) //判断边界
return vector<string>(); //空的话返回空
vector<string> state(1,""); //初始只有一个字符串
for(auto u:digits){ //依次枚举每一个数字
vector<string> now; //新状态
for(auto c:chars[u-'2']) //从2开始,当前数字备选字母
for(auto s:state) //s:所有状态
now.push_backs(s+c); //拼接
state=now;
}
return state;
}
};