【每日算法】LeetCode 93 —— 复原IP地址(一百八十五)

题目内容

给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。

例如:”0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、”192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。

示例

示例 1:

输入:s = “25525511135”
输出:[“255.255.11.135”,”255.255.111.35”]

示例 2:

输入:s = “0000”
输出:[“0.0.0.0”]

示例 3:

输入:s = “1111”
输出:[“1.1.1.1”]

示例 4:

输入:s = “010010”
输出:[“0.10.0.10”,”0.100.1.0”]

示例 5:

输入:s = “101023”
输出:[“1.0.10.23”,”1.0.102.3”,”10.1.0.23”,”10.10.2.3”,”101.0.2.3”]

提示

1、0 <= s.length <= 3000
2、s 仅由数字组成

题解

本题可以用搜索算法求解,这里依旧采用深度优先搜索算法求解。在思路上,就是按照顺序首先确定第一个数是多少,然后是第二个数,第三个数以及第四个数。

在dfs参数的设置上,有应传入的数字字符串s,目前搜索字符串的哪个位置参数u以及需要搜索第几个数k(一共要搜索4个数)。

具体,请看代码实现。

代码

class Solution {
public:
vector<string> ans;
vector<int> path;

vector<string> restoreIpAddresses(string s) {
dfs(0, 0, s);
return ans;
}

// u表示枚举到的字符串下标,k表示当前截断的IP个数,s表示原字符串
void dfs(int u, int k, string &s)
{
if (u == s.size())
{
if (k == 4)
{
string ip = to_string(path[0]);
for (int i = 1; i < 4; i ++ )
ip += '.' + to_string(path[i]);
ans.push_back(ip);
}
return;
}
if (k > 4) return;//有数字没有处理,所以要把这种情况删除掉

unsigned t = 0;
for (int i = u; i < s.size(); i ++ )
{
t = t * 10 + s[i] - '0';
if (t >= 0 && t < 256)
{
path.push_back(t);
dfs(i + 1, k + 1, s);
path.pop_back();
}
if (!t) break;//前导零情况去掉
}
}
};
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/07/06/【每日算法】LeetCode-93-——-复原IP地址(一百八十五)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号