No.93 Restore IP Addresses

93. 复原 IP 地址 - 力扣(LeetCode) (leetcode-cn.com)

 

思路:首先拿到题目,可以看作切割问题,将字符串按照一定的规定,将字符串分割成对应的子字符串,考虑使用回溯。

  • 组合问题:N个数⾥⾯按⼀定规则找出k个数的集合
  • 切割问题:⼀个字符串按⼀定规则有⼏种切割⽅式
  • ⼦集问题:⼀个N个数的集合⾥有多少符合条件的⼦集
  • 排列问题:N个数按⼀定规则全排列,有⼏种排列⽅式
  • 棋盘问题:N皇后,解数独等

既然使用回溯,那么重点就在于: 1)决策树怎么画   2)有哪些状态变量  3)题目中涉及到的字符串变量怎么处理(和leetcode51 N皇后有点像,也需要处理字符串)

1、关于决策树怎么画

       可以根据题意,既然最终的结果是需要四段子字符串,那么就想着怎么构造一个四层的决策树,决策树的树枝放的就是"."的数字。

No.93 Restore IP Addresses

 

2、状态变量

  • int layer 用于记录当前是第几个字串
  • int begin,记录当前字串是从s的哪个位置开始计算的
  • Deque<String> path, 记录某一个结果的路径(可以作为全局变量)

3、如何处理字符串

    这道题可以先将所有的字串给求出来,放入到path中,最后再利用String.join(".", path)用符号"."把path中的元素链接起来

 

class Solution {
       List<String> ans = new ArrayList<>();
    Deque<String> path = new ArrayDeque<>();
    public List<String> restoreIpAddresses(String s) {
 backTrack(0, 0, s);
        return ans;
    }
        public void backTrack(int layer, int begin, String s){
            if(layer==4){
                if(begin == s.length()){
                    ans.add(String.join(".",path));
                }
                return;
            }
            for(int i=begin; i<begin+3; i++){
                if((4-layer)*3 < s.length()-begin){//剩下未分配层数 吃不下 剩余的字母,因为每一层(即每一个字串)最长为3
                    continue;
                }
                if(i > s.length()-1){ // 某一层的字符指针越界了,那么不能再加了,说明后续都不行了
                    break;
                }
                String tmp = s.substring(begin, i+1);
                if(isValid(tmp)){
                    path.add(tmp);
                    backTrack(layer+1, i+1, s);
                    path.removeLast();
                }

            }
    }
  //长度大于1的时候,首字母不能是‘0’, 串不能为空, 长度不可以大于3
    //数值在[0,255]之间
        public boolean isValid(String s) {
        boolean ans = true;
        if((s.length()>1 && s.charAt(0) == '0' || s.isEmpty() || s.length()>3)){
            ans = false;
        }
        int num = Integer.valueOf(s).intValue();
        if(num<0 || num>255){
            ans = false;
        }
        return ans;
    }
}

 

注:关于这个决策树怎么画以、状态变量怎么找、边界状态怎么定这些问题感觉想是想不到的,还是要靠多做,做多了就知道了

       得靠题海战术完事

上一篇:SQL Server数据库一直显示“正在还原”的解决方法


下一篇:【21天精听打卡 2/21】20211110 TED精听 SusanGraham: A new way to restore Earth’s biodiversity—from the air