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.
Input:Digit string "23" Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
Solutions:
用深度优先来组合,如“243”,则先取2中的string中一个,然后4中,然后3中。
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> ret;
if(digits.empty())
return ret;
string map[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
char *middleStr=new char[digits.length()];
dfs(digits, 0, middleStr, map, ret);
return ret;
}
private:
/* vector<string> find2(vector<string> &str1, vector<string> &str2){
vector<string> ret;
//string temp;
for(int i=0; i<str1.size(); ++i) {
string temp=str1[i];
for(int j=0; j<str2.size(); ++j) {
temp+=str2[j];
}
ret.push_back(temp);
}
return ret;
}
*/
void dfs(string &digits, int index, char *middleStr, string map[], vector<string> &ret) {
<span style="white-space:pre"> </span>//index指示本次要取digits的第几个,如digits为“234”,index为1,则要遍历3(def),
<span style="white-space:pre"> </span>//middleStr用来记录遍历到本次时,已经得到的string,以上为例,则其可能是2(abd)中
<span style="white-space:pre"> </span>//的a、b或c,index为2时,则MiddleStr可能为23的任意组合
<span style="white-space:pre"> </span>if(index==digits.length()) {
<span style="white-space:pre"> </span>string temp(&middleStr[0], &middleStr[digits.length()-1]);
<span style="white-space:pre"> </span>ret.push_back(temp);
<span style="white-space:pre"> </span>return ;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>char ch=digits[index];
<span style="white-space:pre"> </span>for(int i=0; i<map[ch-'0'].length(); ++i) {
<span style="white-space:pre"> </span>middleStr[index]=map[ch-'0'][i];
<span style="white-space:pre"> </span>dfs(digits, index+1, middleStr, map, ret);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
};