• 算法通关村第18关【黄金】| 继续回溯


    1.复原IP地址

    思路:

    单层for循环start控制开始位置,逐个遍历情况取,附带剪枝,递归返回后进行point回溯

    深度递归pointNum三层,确定终止条件

    1. class Solution {
    2. List result = new ArrayList<>();
    3. public List restoreIpAddresses(String s) {
    4. if(s.length()>12){
    5. return result;
    6. }
    7. trace(s,0,0);
    8. return result;
    9. }
    10. public void trace(String s,int start,int pointNum){
    11. if(pointNum == 3){
    12. if (isValid(s,start,s.length()-1)) {
    13. result.add(s);
    14. }
    15. return;
    16. }
    17. for(int i = start;i
    18. if(isValid(s,start,i)){
    19. pointNum++;
    20. s = s.substring(0,i+1) + "." + s.substring(i+1);
    21. trace(s,i+2,pointNum);
    22. pointNum--;// 回溯
    23. s = s.substring(0, i + 1) + s.substring(i + 2);// 回溯删掉逗点
    24. }else{
    25. break;
    26. }
    27. }
    28. }
    29. private Boolean isValid(String s, int start, int end) {
    30. if (start > end) {
    31. return false;
    32. }
    33. if (s.charAt(start) == '0' && start != end) { // 0开头的数字不合法
    34. return false;
    35. }
    36. int num = 0;
    37. for (int i = start; i <= end; i++) {
    38. if (s.charAt(i) > '9' || s.charAt(i) < '0') { // 遇到⾮数字字符不合法
    39. return false;
    40. }
    41. num = num * 10 + (s.charAt(i) - '0');
    42. if (num > 255) { // 如果⼤于255了不合法
    43. return false;
    44. }
    45. }
    46. return true;
    47. }
    48. }

    2.电话号码的字母组合

    思路:回溯模板

    层的选择元素为c[num],for(int i = 0;i

    深度为digits的长度,确定终止条件

    1. class Solution {
    2. public List letterCombinations(String digits) {
    3. List list = new ArrayList();
    4. if(digits.length() == 0){
    5. return list;
    6. }
    7. char[][] c = {
    8. {'a','b','c'},
    9. {'d','e','f'},
    10. {'g','h','i'},
    11. {'j','k','l'},
    12. {'m','n','o'},
    13. {'p','q','r','s'},
    14. {'t','u','v'},
    15. {'w','x','y','z'}
    16. };
    17. int len = digits.length();
    18. char[] s = new char[len];
    19. trace(c,s,list,0,digits);
    20. return list;
    21. }
    22. public void trace(char[][] c,char[] s,List list,int cur,String digits){
    23. if(cur == s.length){
    24. list.add(new String(s));
    25. return;
    26. }
    27. int num = digits.charAt(cur) - '0';
    28. for(int i = 0;i2].length;i++){
    29. num = digits.charAt(cur) - '0';
    30. s[cur] = c[num-2][i];
    31. trace(c,s,list,cur+1,digits);
    32. }
    33. }
    34. }

    3.括号生成

    思路:回溯

    层的选择元素有两个 '(' ,')',但是不能瞎选需要满足题目要求也就是要进行剪枝

    • 剩余左括号数量要小于等于右括号数量
    • 剩余的括号数量要大于0

    由深度也就是n*2总共长度,确定终止条件

    1. class Solution {
    2. public List generateParenthesis(int n) {
    3. List list = new ArrayList<>();
    4. char[] s = new char[n*2];
    5. trace(n,n,s,list,0);
    6. return list;
    7. }
    8. public void trace(int left,int rigth,char[] s,List list,int cur){
    9. if(left == 0 && rigth == 0){
    10. list.add(new String(s));
    11. return;
    12. }
    13. if(left-1>=0&&left-1<=rigth){
    14. s[cur] = '(';
    15. trace(left-1,rigth,s,list,cur+1);
    16. }
    17. if(rigth-1>=0&&left<=rigth-1){
    18. s[cur] = ')';
    19. trace(left,rigth-1,s,list,cur+1);
    20. }
    21. }
    22. }

  • 相关阅读:
    什么叫做阻塞队列的有界和无界
    什么是HTML和CSS?
    RSA的C++语言描述简单实现
    【python环境搭建】一台电脑下安装不同python版本时如何安装模块
    Python基础tuple元组定义与函数
    弹性盒布局中的flex属性使用
    C++如何写自定义的头文件
    js数组、对象、字符串常用方法
    leetcode:1957. 删除字符使字符串变好
    Linux | 一篇文章带你深刻理解粘滞位
  • 原文地址:https://blog.csdn.net/Candy___i/article/details/133868904