LeetCode 17 Medium
解题思路:
利用DFS和HashTable的方法,使用逐层递归进行求解(如果digits的长度太长会导致递归栈爆掉),设置全局的vector存储最后的结果。
代码:
class Solution {
public:
vector<string> final_book;
//利用回溯算法,对vector进行追加
void addDfs(vector<string> registor_book,string str,int k,string digits){
int i,j;
if(str.length() == digits.length()){
final_book.push_back(str);
return;
}
//想final_book添加字符元素
string str_next = registor_book[digits[k]-50];
for(i=0;i<str_next.length();i++){
str = str+str_next[i];
addDfs(registor_book,str,k+1,digits);
str.pop_back();
}
return;
}
vector<string> letterCombinations(string digits) {
vector<string> registor_book;
vector<string> final_result;
if(digits.length() == 0){
return final_result;
}
//牺牲空间换时间 将所有字母登记到登记册上 采用直接散列的方式查找
int i,j,k,t;
for(i=0;i<5;i++){
string tmp = "";
char tmp_char;
for(j=i*3;j<i*3+3;j++){
tmp_char = 'a'+j;
tmp = tmp+tmp_char;
}
registor_book.push_back(tmp);
}
//将后三组单独推入vector
char after_char;
string after_str = "";
for(i=0;i<4;i++){
after_char = 'p'+i;
after_str = after_str+after_char;
}
registor_book.push_back(after_str);
after_str = "";
for(i=0;i<3;i++){
after_char = 't'+i;
after_str = after_str+after_char;
}
registor_book.push_back(after_str);
after_str = "";
for(i=0;i<4;i++){
after_char = 'w'+i;
after_str = after_str+after_char;
}
registor_book.push_back(after_str);
//回溯寻找最优解
if(digits.length() == 1){
for(i=0;i<registor_book[digits[0]-50].length();i++){
string str = "";
str = str+registor_book[digits[0]-50][i];
final_book.push_back(str);
}
}
//处理多字符串的情况
if(digits.length() > 1){
//调用回溯算法,添加字符串
addDfs(registor_book,"",0,digits);
}
return final_book;
}
};