今日签到题,题目如下:
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.' 分隔。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/restore-ip-addresses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
想了许久,想不到什么好方法,看题解,原来都是暴力解。。。。
暴力解就没什么好说的,就是注意遍历区间和跳出枚举的条件。
复杂度分析:
3次嵌套循环,但是每次最多只循环3次,时间复杂度 O(3*3*3);
只有使用一个列表保存结果,没有其他额外空间,空间复杂度O(1)。
以下为自己提交的代码:
public class Solution {
public IList<string> RestoreIpAddresses(string s) {
List<string> result = new List<string>();
int lenI = Math.Min(3, s.Length - 3);
int lenS = s.Length + 3;
for (int i = Math.Max(0, s.Length - 10); i < lenI; i++)
{
int a = int.Parse(s.Substring(0,i + 1));
if (a > 255) break;
int lenJ = Math.Min(i + 4, s.Length - 2);
for (int j = Math.Max(i + 1, s.Length - 7); j < lenJ; j++)
{
int b = int.Parse(s.Substring(i + 1,j-i));
if (b > 255) break;
int lenK = Math.Min(j + 4, s.Length - 1);
for (int k = Math.Max(j + 1, s.Length - 4); k < lenK; k++)
{
int c = int.Parse(s.Substring(j + 1,k-j));
if (c > 255) break;
int d = int.Parse(s.Substring(k + 1,s.Length - k - 1));
if (d > 255) continue;
string temp = a.ToString() + '.' + b.ToString() + '.' + c.ToString() + '.' + d.ToString();
if (temp.Length == lenS)
result.Add(temp);
}
}
}
return result.ToArray();
}
}