- 描述
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();
}
}
}
}
}
- 相关链接
LeetCode原题地址:https://leetcode.com/problems/restore-ip-addresses/description/