LeetCode刷题:93. Restore IP Addresses

LeetCode刷题:93. Restore IP Addresses

原题链接:https://leetcode.com/problems/restore-ip-addresses/description/

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)

这个题目的意思是给定一个字符串,分解出所有有可能的合法的IP地址的组合。

问题分析

有效的IP地址形式: 1.1.1.1 可以划分为4段,
每段从0-255,例如 255.255.255.255 是有效的IP地址
这样的话,不计算分隔符点位(.),组成一个有效的IP地址最少需要4位;最大是12位

这个问题如果采用DFS算法求解,解题思路如下:

边界条件,对于目标字符串sTarget来说:

if (sTarget == null || sTarget.length() <= 0 || sTarget.length() < 4 || sTarget.length() > 12) {
            //返回
            return ANSWER;
        }

算法设计

package com.bean.algorithmbasic;

import java.util.ArrayList;
import java.util.List;

public class RestoreIPAddressDemo3 {

    /*
     * 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)
     */

    /*
     * DFS算法
     * 
     */
    // 深度优先遍历,DFS即可实现,用ANSWER保存结果
    List<String> ANSWER = new ArrayList<String>();

    public List<String> restoreIpAddresses(String s) {
        /*
         * 有效的IP地址形式: 1.1.1.1 可以划分为4段,
         * 每段从0-255,例如 255.255.255.255 是有效的IP地址
         * 这样的话,不计算分隔符点位(.),组成一个有效的IP地址最少需要4位;
         * 最大是12位 给出下面的判断条件处理各种不同的错误情况
         */
        if (s == null || s.length() <= 0 || s.length() < 4 || s.length() > 12) {
            //返回
            return ANSWER;
        }
        String tmp = "";
        // 调用DFS算法,并传入了4个参数
        dfsIPAddress(s, 0, 0, tmp);
        //返回
        return ANSWER;
    }

    // index 记录开始的位置,k记录截取的数量,s为目标字符串
    void dfsIPAddress(String s, int index, int k, String tmp) {
        //设置边界条件
        if (k == 3) {
            String t = s.substring(index, s.length());
            //判断是否符合合法的IP地址规则
            if (check(t))
                //添加到结果中
                ANSWER.add(tmp + t);
            return;
        } else {
            // 每一次最长的截取长度是i,最短1位,最长3位
            for (int i = 1; i <= 3 && index + i < s.length(); i++) {
                String t = s.substring(index, index + i);
                if (check(t))
                    dfsIPAddress(s, index + i, k + 1, tmp + t + ".");
            }
        }
    }

    //IP地址检查
    public boolean check(String ip) {
        // 以0开始的字符串,只有0是合理的,其余的比如001等等都不是合理的
        if (ip.charAt(0) == '0') {
            if (ip.equals("0"))
                return true;
            else
                return false;
        } else {
            int ipNum = Integer.parseInt(ip);
            //整数范围在0-255之间,合法
            if (ipNum > 0 && ipNum <= 255)
                return true;
            else // 非法的IP地址段数值范围
                return false;
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        RestoreIPAddressDemo3 restoreIP = new RestoreIPAddressDemo3();

        String str = "25525511135";
        List<String> ipList = restoreIP.restoreIpAddresses(str);
        System.out.println(ipList);

    }

}

运行结果:

[255.255.11.135, 255.255.111.35]

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值