[算法题解详细]回溯法解力扣17电话号码的字母组合

class Solution {

public:

int n;

string letter[10] = {“”, “”, “abc”, “def”, “ghi”, “jkl”, “mno”, “pqrs”, “tuv”, “wxyz”};

vector ans;

string temp;

vector letterCombinations(string digits) {

n = digits.length();

ans.clear();

if(digits.length() == 0) {

return ans;

}

dfs(digits, 0);

return ans;

}

};

dfs函数中,出口条件还是当递归层等于了digits数组的长度时,我们将当前temp保存的字符串组合加入ans容器中,因为我们在dfs中设置的条件,会让只要是递归到了这一层的temp就是一定满足答案的字符串组合,加入容器后我们直接终止当前递归,回溯到上一层递归,寻找其他可行的字符串组合

void dfs(string& digit 《大厂前端面试题解析+Web核心总结学习笔记+企业项目实战源码+最新高清讲解视频》无偿开源 徽信搜索公众号【编程进阶路】 s, int u) {

if(u == n) {

ans.push_back(temp);

return;

}

}

在这里我们要注意digits数组是一个字符串,所以我们取每一位字符的时候需要转为数字才能直接使用为下标,将字符转为数字的方法有很多,我这里是直接**-'0’字符转成数字**,然后在每一次递归中我们都要循环一遍当前的letter下标为digits[u]数字的字符串,来进行组合,这里要注意回溯的应用,就是temp在下一层递归前添加当前选中的字符,在下一层递归完成后,我们需要回到添加字符前的那一步,方便寻找其他的可行的组合

void dfs(string& digits, int u) {

if(u == n) {

ans.push_back(temp);

return;

}

int t = digits[u] - ‘0’;

for(int i = 0; i < letter[t].length(); i++) {

if(u + 1 > n) {

return;

}

temp += letter[t][i];

dfs(digits, u + 1);

temp = temp.substr(0, temp.length() - 1);

}

}

这里加了一个u+1是防止越界的,同时也相当于一个剪枝

下面是完整代码:

class Solution {

public:

int n;

string letter[10] = {“”, “”, “abc”, “def”, “ghi”, “jkl”, “mno”, “pqrs”, “tuv”, “wxyz”};

vector ans;

string temp;

void dfs(string& digits, int u) {

if(u == n) {

ans.push_back(temp);

return;

}

int t = digits[u] - ‘0’;

for(int i = 0; i < letter[t].length(); i++) {

if(u + 1 > n) {

return;

}

temp += letter[t][i];

dfs(digits, u + 1);

temp = temp.substr(0, temp.length() - 1);

}

}

vector letterCombinations(string digits) {

n = digits.length();

ans.clear();

if(digits.length() == 0) {

return ans;

}

dfs(digits, 0);

return ans;

}

};
大家好我是程序员云锦,致力于前端和算法方向,希望大家可以多多支持我,目前我正在坚持每日刷题中,感兴趣的你可以和我一起同步刷题哦!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值