93. Restore IP Addresses

本文介绍了一种通过递归算法从给定的数字字符串中恢复所有可能的有效IP地址组合的方法。通过对示例“25525511135”的分析,详细解释了如何处理各种情况,并给出了C#实现的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 描述

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的地址的规则:由四位数组成,这四位数都介于0-255,四位数以“.”号分割。
    然后题目是给出一串数字字符串,要求组成ip地址。以示例给出的数字串进行分析,当计算机拿到”25525511135”时,计算机扫描数字字符串尝试组成一个ip地址的第一个数字的时候,有三种情况
    1.ip的第一个数字为2;
    2.ip的第一个数字为25;
    3.ip的第一个数字为255;

这三种情况都应该尝试,然后在考虑其他的数字。

分析了第一个ip数字的组成,其他的三个ip数字也可以用类似的方法,所以可以用递归去解决这种问题。现在最重要的问题就是递归的终止条件,显然,当数字字符串全部组合完成就终止,还有另外一种情况,剩余的数字字符串少于剩余的ip数字个数或多于剩余的ip数字个数。

  • 代码(c#)


public IList<string> RestoreIpAddresses(string s)
        {
            Stack<string> stack = new Stack<string>();
            List<string> list = new List<string>();
            GetIp(s, stack, list);
            return list;
        }

        public void GetIp(string s, Stack<string> stack, IList<string> result)
        {
            if (stack.Count == 4)//递归终止条件出现:组成了完整的Ip
            {
                if (s.Length == 0)//所有的数字字符串解析完毕,得到一个ip
                    result.Add(string.Join(".", stack.ToArray().Reverse()));
                return;
            }
            var lowestLength = 4 - stack.Count;
            var maxLength = (4 - stack.Count) * 3;
            if (lowestLength > s.Length || s.Length > maxLength)//终止的条件出现:剩余的数字字符串不能组成完整的ip
                return;
            stack.Push(s.Substring(0, 1));
            GetIp(s.Substring(1, s.Length - 1), stack, result);//尝试第一种情况
            stack.Pop();
            if (s[0] != '0' && s.Length >= 2)
            {
                stack.Push(s.Substring(0, 2));
                GetIp(s.Substring(2, s.Length - 2), stack, result);//尝试第二种情况
                stack.Pop();
                if (s.Length >= 3)
                {
                    int address = 0;
                    if (int.TryParse(s.Substring(0, 3), out address))
                    {
                        if (address <= 255)
                        {
                            stack.Push(s.Substring(0, 3));
                            GetIp(s.Substring(3, s.Length - 3), stack, result);//尝试第三种情况
                            stack.Pop();
                        }
                    }
                }
            }

        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值