思路——DFS
- ”2“——一个循环
- ”23“——两个循环
- ”234“——三个循环
…
递归参数——digits所指数字,当前s,第几层循环
代码
class Solution {
public:
vector<string> ans;
vector<string> sList={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; //字符表
void backtracing(string digits, string s, int idx){
//递归终止条件
if(idx==digits.size()){
ans.push_back(s);
return;
}
else{
int pos=digits[idx]-'0';
string tmpStr=sList[pos];
//单层搜索逻辑
for(int i=0;i<tmpStr.size();++i){
backtracing(digits,s+tmpStr[i],idx+1);
}
}
}
vector<string> letterCombinations(string digits) {
if(digits.size()==0) return {};
backtracing(digits, {}, 0);
return ans;
}
};
例子
”2“
helper(digits,a,1)
ans.push(a)
helper(digits,b,1)
ans.push(b)
helper(digits,c,1)
ans={a,b,c}
"23"
helper(digits,a,1)
helper(digits,ad,2)
ans.push(ad)
helper(digits,ae,2)
ans.push(ae)
helper(digits,af,2)
ans.push(af)
...
思路——BFS
- 将第一个数字对应的字母序列依次入队
- 对剩余数字进行遍历,获取其int值,再定位到指定的字母序列
- 若队列头元素长度小于目标长度-1,则进行广度搜索
- 数字序列遍历完毕,当前队列剩余的元素即答案
代码
class Solution {
public:
vector<string> ans;
vector<string> sList={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; //字符表
vector<string> letterCombinations(string digits) {
if(digits.size()==0) return {};
queue<string> q;
// 遍历digits
for(int i=0;i<digits.size();i++){
int pos=digits[i]-'0';
string s=sList[pos];
if(i==0){//首字母压入队列
string initStr;
for(int j=0;j<s.size();++j){
initStr=s[j];
q.push(initStr);
}
}
else{//广度遍历
while(q.front().size()<i+1){
for(int j=0;j<s.size();++j)
q.push(q.front()+s[j]);
q.pop();
}
}
}
//获取答案
while(!q.empty()){
ans.emplace_back(q.front());
q.pop();
}
return ans;
}
};