93. Restore IP Addresses

文章目录

1 题目理解

输入:字符串s
输出:可能的ip地址
规则:一个有效的ip地市是一连串数字,数字范围在0到255,每个数字不能有前导0。例如"0.1.2.201" and "192.168.1.1"是有效ip地址。"0.011.255.245"不是有效地址。“192.168.1.312” and "192.168@1.1"也不是有效地址。

Example 1:

Input: s = “25525511135”
Output: [“255.255.11.135”,“255.255.111.35”]
Example 2:

Input: s = “0000”
Output: [“0.0.0.0”]
Example 3:

Input: s = “1111”
Output: [“1.1.1.1”]
Example 4:

Input: s = “010010”
Output: [“0.10.0.10”,“0.100.1.0”]

2 回溯

依次处理字符串的每一位。例如s=“25525511135”。
例如处理第0个2:2是一个单独的值。
处理第1个5,可以是一个单独的值5,也可以和前面的2合起来组成25。
处理第2个5,可以是一个单独的值5,也可以和前面的25合起来组成255。

一般就是:
处理第n个字符,可以是一个单独的值value1,也可以和前面部分的值preValue组合成一个新的数值value2。

大致思路是这样的。在处理中会发现遇到0的情况。那就是preValue=0的时候,当前字符就不能和preValue组成新的值了。没有这个选项。

只有在生成的数字个数小于4个的时候,才可以形成单独形成一个值value1。

class Solution {
    private char[] chars;
    private List<String> result;
    public List<String> restoreIpAddresses(String s) {
        if(s==null || s.length()<4) return new ArrayList<String>();
        this.chars = s.toCharArray();
        result = new ArrayList<String>();
        dfs(0,0,0,new ArrayList<Integer>());
        return result;
    }
    
    private void dfs(int index,int preValue,int numberCount,List<Integer> values){
        if(index>=chars.length){
            if(numberCount==4){
                StringBuilder strb = new StringBuilder();
                strb.append(values.get(0));
                for(int i=1;i<values.size();i++){
                    strb.append(".").append(values.get(i));
                }
                result.add(strb.toString());
            }
            
            return;
        }
        if(numberCount>4) return;
        int value = chars[index]-'0';
        //单独成为一个值
        if(numberCount<4) {
            values.add(value);
        	dfs(index+1,value,numberCount+1,values);
            values.remove(values.size()-1);
        }
        //拼在前一个后面
        if(preValue>0){
            int newValue = preValue*10+value;
            if(newValue<=255){
                values.add(newValue);
                dfs(index+1,newValue,numberCount,values);
                values.remove(values.size()-1);
            }
        }
    }
}

时间复杂度 O ( 4 ∗ 2 n ) O(4*2^n) O(42n) ,n是字符串长度。每一个字符都有2种选择。对于每一个结果要拼装回答案需要遍历数组,数组长度是4。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值