- Restore IP Addresses
Medium
Given a string s containing only digits, return all possible valid IP addresses that can be obtained from s. You can return them in any order.
A valid IP address consists of exactly four integers, each integer is between 0 and 255, separated by single dots and cannot have leading zeros. For example, “0.1.2.201” and “192.168.1.1” are valid IP addresses and “0.011.255.245”, “192.168.1.312” and “192.168@1.1” are invalid IP addresses.
Example 1:
Input: s = “25525511135”
Output: [“255.255.11.135”,“255.255.111.35”]
Example 2:
Input: s = “0000”
Output: [“0.0.0.0”]
Example 3:
Input: s = “1111”
Output: [“1.1.1.1”]
Example 4:
Input: s = “010010”
Output: [“0.10.0.10”,“0.100.1.0”]
Example 5:
Input: s = “101023”
Output: [“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]
Constraints:
0 <= s.length <= 3000
s consists of digits only.
解法1:
这题有点像全排列和全组合。但不同的是全排列和全组合用过的元素都要pop_back,因为只能用1次。这里就是从左往右扫描,不需要pop_back。
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> res;
dfs(s, 0, "", res);
return res;
}
private:
bool isValid(string s) {
if (s.empty() || s.size() > 3 || (s.size() > 1 && s[0] == '0')) return false;
int res = atoi(s.c_str());
return (res >= 0 && res <= 255);
}
void dfs(string s, int level, string output, vector<string> &res) {
if (level == 4) {
if (s.empty()) res.push_back(output);
return;
}
for (int i = 1; i <= 3; ++i) {
if (s.size() >= i && isValid(s.substr(0, i))) {
string new_output = output + s.substr(0, i);
if (level < 3) new_output = new_output + ".";
dfs(s.substr(i), level + 1, new_output, res);
}
}
}
};
本文介绍了如何从一串数字字符串中恢复所有可能的合法IPv4地址。通过深度优先搜索(DFS)策略,逐个检查子字符串以确保它们是有效的IP地址部分。题目要求不包含前导零,并且每个部分必须在0到255之间。提供的解决方案详细展示了如何实现这个算法,包括检查有效性的辅助函数和递归搜索过程。

1万+

被折叠的 条评论
为什么被折叠?



