leetcode中等93复原IP地址

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等93复原IP地址相关的知识,希望对你有一定的参考价值。


注意:
分成四段;每一段在[0,255]之间;每一段不能用前导0

思路:回溯
以往只需要一个index记录回溯的起始位置
需要两个index,segId表示第几段,segStart表示每一段开头的位置

结束条件:

  • 1、 如果找到了 4 段 IP 地址并且遍历完了字符串,那么就是一种答案
  • 2、如果还没有找到 4 段 IP 地址就已经遍历完了字符串,那么提前结束

回溯情况:

  • 3、 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0,dfs 进入下一段的搜索
  • 4、一般情况,for 循环枚举每一种可能性并递归

补充:本题由于每一段分别计算,无需回撤操作

class Solution {
    List<String>res=new ArrayList<>();
    int[] path = new int[4];
    //List<String>path=new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        dfs(s,0,0);
        return res;
    }

    //需要两个index,segId表示第几段,segStart表示每一段开头的位置
    public void dfs(String s,int segId, int segStart){
        //1、 如果找到了 4 段 IP 地址并且遍历完了字符串,那么就是一种答案
        if(segId==4){
            if(segStart==s.length()){
                StringBuilder temp=new StringBuilder();
                temp.append(path[0]);
                for(int i=1;i<4;i++){
                    temp.append(".");
                    temp.append(path[i]);
                }
                res.add(temp.toString());
            }
            return;
        }

        //2、 如果还没有找到 4 段 IP 地址就已经遍历完了字符串,那么提前回溯
        if(segStart==s.length()){
            return;
        }

        //3、 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0
        if(s.charAt(segStart)=='0'){
            path[segId]=0;
            dfs(s,segId+1,segStart+1);
        }
        //4、一般情况,枚举每一种可能性并递归
        int sum=0;//计算本段是否在0,255之间
        for(int i=segStart;i<s.length();i++){
            sum = sum * 10 + (s.charAt(i) - '0');
            if(sum>0 && sum<=255){
                path[segId]=sum;
                dfs(s,segId+1,i+1);
            }else{
                break;
            }
        }
    }

}

以上是关于leetcode中等93复原IP地址的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 每日一题 93. 复原IP地址

[JavaScript 刷题] 搜索 - 复原 IP 地址, leetcode 93

93. 复原 IP 地址回溯Normal

leetcode-93-复原ip地址

LeetCode 93. 复原IP地址

LeetCode 93. 复原IP地址