题目
给定一个数字字符串,返回数字可能表示的所有可能的字母组合。
数字到字母的映射(就像电话上的按钮一样)如下所示。
Input:Digit string "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
实现思路,使用了3层for循环,效率:
//分割一个例如"abc" => 为一个{"a","b","c"}的数组
vector<string> splitString(string str)
{ vector<string> subString;
for (int i = 0; i < str.size(); ++i)
{
subString.push_back(str.substr(i, 1));
}
return std::move(subString);
}
vector<string> getString(vector<string> numbers)
{
//映射表
unordered_map<string, string> theMap =
{
{ "0", "" },
{ "1", "" },
{ "2", "abc" },
{ "3", "def" },
{ "4", "ghi" },
{ "5", "jkl" },
{ "6", "mno" },
{ "7", "pqrs" },
{ "8", "tuv" },
{ "9", "wxyz" }
};
//将要输出的容器
vector<string> outputs;
for (string num : numbers)
{
if (theMap.find(num) == theMap.end())
{
//error
return{};
}
vector<string> subString = splitString(theMap[num]);
//思路:每次取出上一次的操作字符串结果,和当前要操作的字符串合并
vector<string> tempOutputs;
for (string subStr : subString)
{
if (outputs.empty())
{
tempOutputs.push_back(subStr);
continue;
}
for (string str : outputs)
{
tempOutputs.push_back(str + subStr);
}
}
//每次更新字符串数据
std::swap(outputs, tempOutputs);
}
return std::move(outputs);
}
测试Code如下:
auto stringVector = getString({ "2", "3", "5" });
for (auto str : stringVector)
{
cout << " :" << str << endl;
}