其他分享
首页 > 其他分享> > No.93 Restore IP Addresses

No.93 Restore IP Addresses

作者:互联网

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

 

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

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

1、关于决策树怎么画

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

 

2、状态变量

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;
    }
}

 

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

       得靠题海战术完事

标签:Restore,begin,Addresses,int,字符串,ans,No.93,path,String
来源: https://www.cnblogs.com/charonkk/p/15478420.html