week6-leetcode #17-Letter Combinations of a Phone Number[Medium]
题目地址: https://leetcode.com/problems/letter-combinations-of-a-phone-number/
Question
Given a digit string, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below.
Example
Input:Digit string "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
Solution
time complecity: O(n3)
space complecity: O(n)
runtime: 0ms
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> chars;
vector<string> result;
vector<string> realResult;
vector<string> candidate;
string realDigits;
for (int i = 0; i < digits.size(); i++) {
int digit = digits[i]-'0';
if (digit != 0 && digit != 1) {
realDigits.push_back(digits[i]);
}
}
// 总共的有几个
int digitLength = realDigits.length();
for (int i = 0; i < digitLength; i++) {
int digit = realDigits[i]-'0';
chars.push_back(table[digit]);
}
// 将号码进行组合
bool isFirstRun = true;
for (int i = 0; i < digitLength; i++) {
string oneChars = chars[i];
int oneCharsLength = oneChars.size();
for (int j = 0; j < oneCharsLength; j++) {
string s;
s.push_back(oneChars[j]);
if (isFirstRun) {
result.push_back(s);
} else {
int resultCurrentLength = result.size();
for (int k = 0; k < resultCurrentLength; k++) {
if (result[k].size() == i)
result.push_back(result[k]+s);
}
}
}
isFirstRun = false;
}
int resultLength = result.size();
this->chars = chars;
this->digitLength = digitLength;
for (int i = 0; i < resultLength; i++) {
if (result[i].size() == digitLength) {
realResult.push_back(result[i]);
}
}
return realResult;
}
private:
vector<string> table = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> chars;
int digitLength;
};
思路:首先找到每个数字对应的字母集合(如”abc”, “def”则属于同一个数字(这里是2,3)对应的一个字母集合)。第一层循环遍历所有数字,第二层循环遍历数字对应的字母集合,第三层循环将与上一次添加到vector中的字符串相加,再加入vector。最后只需要根据长度找出满足要求的即可。