LeetCode刷题记录8-根据条件反回指定字符串

题目

给定一个数字字符串,返回数字可能表示的所有可能的字母组合。
数字到字母的映射(就像电话上的按钮一样)如下所示。
这里写图片描述

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;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/gx864102252/article/details/79135140
今日推荐