电话号码的字母组合,是大家熟悉的字母九宫格键盘,按照题目要求尽可能的按照字母排序;
所有的数据盘排列和下图大致相当;
解题思想是:
相邻的两个数字中,第一个数字所包含的字母是根节点,第二个数字包含的字母自动分配到每个根节点上,按照这种思想,我们只需要处理相邻两个数字,对每个根节点进行扩展,得到所有想要的组合;
class Solution {
public:
//手机上每个数字对应的字母
vector<string> numTostring(char n)
{
vector<string> ans;
switch (n)
{
case '2':
ans = { "a","b","c" };
break;
case '3':
ans = { "d","e","f" };
break;
case '4':
ans = { "g","h","i" };
break;
case '5':
ans = { "j","k","l" };
break;
case '6':
ans = { "m","n","o" };
break;
case '7':
ans = { "p","q","r", "s" };
break;
case '8':
ans = {"t","u","v"};
break;
case '9':
ans = { "w","x","y","z" };
break;
}
return ans;
}
//相邻数字所代表的所有字母组合种类
vector<string> Ins(char n, vector<string>m)
{
vector<string> ans;
int cnt = 0;
auto s = numTostring(n);
if (m.empty())
{
for (auto i = s.begin(); i != s.end(); i++, cnt++)
{
ans.push_back(*i);
}
}
else
{
for (auto i = m.begin(); i != m.end(); i++)
{
for (auto j = s.begin(); j != s.end(); j++)
{
ans.push_back(*i + *j);
}
}
}
return ans;
}
//字母组合的主干
vector<string> letterCombinations(string digits)
{
vector<string> ss;
for (auto i = digits.begin(); i!= digits.end(); i++)
{
ss=Ins(*i, ss);
}
sort(ss.begin(), ss.end());
return ss;
}
};