2023-01-21 Daily Challenge
Today I have done leetcode's January LeetCoding Challenge with cpp
.
January LeetCoding Challenge 21
Description
Restore IP Addresses
A valid IP address consists of exactly four integers separated by single dots. Each integer is between 0
and 255
(inclusive) and cannot have leading zeros.
- For example,
"0.1.2.201"
and"192.168.1.1"
are valid IP addresses, but"0.011.255.245"
,"192.168.1.312"
and"192.168@1.1"
are invalid IP addresses.
Given a string s
containing only digits, return all possible valid IP addresses that can be formed by inserting dots into s
. You are not allowed to reorder or remove any digits in s
. You may return the valid IP addresses in any order.
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 = "101023" Output: ["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
Constraints:
1 <= s.length <= 20
s
consists of digits only.
Solution
class Solution {
int len;
int minmax[4][2] = {{}, {-1, 10}, {9, 100}, {99, 256}};
void addIP(
vector<string> &answer,
vector<string> ¤tIP
) {
string ip;
for(auto subnet : currentIP) {
ip += subnet;
ip.push_back('.');
}
ip.pop_back();
answer.emplace_back(ip);
}
void dfs(
vector<string> &answer,
vector<string> ¤tIP,
string &s,
int pos
) {
if(pos == len) {
if(currentIP.size() == 4) addIP(answer, currentIP);
return;
}
for(int i = 1; i < 4 && pos + i <= s.length(); ++i) {
string subnet = s.substr(pos, i);
int n = stoi(subnet);
if(n <= minmax[i][0]) break;
if(n < minmax[i][1]) {
currentIP.emplace_back(subnet);
dfs(answer, currentIP, s, pos + i);
currentIP.pop_back();
}
}
}
public:
vector<string> restoreIpAddresses(string s) {
len = s.length();
vector<string> answer;
vector<string> ip;
dfs(answer, ip, s, 0);
return answer;
}
};
// Accepted
// 145/145 cases passed (8 ms)
// Your runtime beats 19.08 % of cpp submissions
// Your memory usage beats 70.83 % of cpp submissions (6.6 MB)