LeetCode —— Letter Combinations of a Phone Number(17) permutations(46)
1. Letter Combinations of a Phone Number(17)
题目:
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
class Solution
{
public:
vector<string> letterCombinations(string digits)
{
vector<string> result;
if(digits.empty()) return vector<string>();
static const vector<string> v = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
result.push_back("");
for(int i = 0 ; i < digits.size(); ++i)
{
//得出每一个数字
int num = digits[i]-'0';
if(num < 0 || num > 9) break;
const string& candidate = v[num];
if(candidate.empty())
continue;
vector<string> tmp;
for(int j = 0 ; j < candidate.size() ; ++j)
{
for(int k = 0 ; k < result.size() ; ++k)
{
tmp.push_back(result[k] + candidate[j]);
}
}
result.swap(tmp);
}
return result;
}
};
2.permutations 全排列(46)
给定一个没有重复数字的序列,返回其所有可能的全排列。
class Solution {
public:
vector<vector<int> > permute(vector<int> &num) {
vector<vector<int> > result;
permuteRecursive(num, 0, result);
return result;
}
// permute num[begin..end]
// invariant: num[0..begin-1] have been fixed/permuted
void permuteRecursive(vector<int> &num, int begin, vector<vector<int> > &result) {
if (begin >= num.size()) {
// one permutation instance
result.push_back(num);
return;
}
for (int i = begin; i < num.size(); i++) {
swap(num[begin], num[i]);
permuteRecursive(num, begin + 1, result);
// reset
swap(num[begin], num[i]);
}
}
};
参考链接: https://leetcode.com/problems/permutations/discuss/?currentPage=1&orderBy=most_votes&query=