[LeetCode]Restore IP Addresses

Question
Given a string containing only digits, restore it by returning all possible valid IP address combinations.

For example:
Given "25525511135",

return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)


本题难度Medium。

DFS

【复杂度】
时间 O(N) 空间 O(N)

【思路】
利用DFS进行搜索,到达底部加入到结果中。这里需要用到剪枝(第19行)。

【注意】
有效的ip不允许前缀为0,比如:010,但允许单个0。

【代码】

public class Solution {
    public List<String> restoreIpAddresses(String s) {
        //require
        List<String> ans=new LinkedList<>();
        List<String> ip=new LinkedList<>();
        //invariant
        dfs(ip,s,0,ans);
        //ensure
        return ans;
    }
    private void dfs(List<String> ip,String s,int start,List<String> ans){
        //base case
        if(ip.size()==4&&start==s.length()){
            ans.add(ip.get(0)+"."+ip.get(1)+"."+ip.get(2)+"."+ip.get(3));
            return;
        }

        int remain=4-ip.size();
        if(remain>(s.length()-start)||remain*3<(s.length()-start))return;   //剪枝
        int num=0;
        for(int i=start;i<start+3;i++){
            if(i+1<=s.length()){
                num=num*10+s.charAt(i)-'0';
                if(num>=0&&num<=255){
                    ip.add(s.substring(start,i+1));
                    dfs(ip,s,i+1,ans);
                    ip.remove(ip.size()-1);
                }
                if(num==0)break;//不允许前缀为0,但允许单个0
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值