题意:
原题链接
思路:
枚举分界点,保证分界后的每段是合法的才进行深搜即可。
代码:
类成员变量版本
class Solution {
public:
string str;
vector<string> res;
int a[4];
int n;
int get(int l, int r) {
if(r - l > 0 && str[l] == '0') return -1;
int ans = 0;
for(int i = l; i <= r; ++i)
ans = ans * 10 + str[i] - '0';
return ans;
}
void dfs(int u, int p) {
if(u == 4) {
if(p >= str.size()) {
string tmp = to_string(a[0]);
for(int i = 1; i < 4; ++i) {
tmp += ".";
tmp += to_string(a[i]);
}
res.push_back(tmp);
}
return ;
}
for(int i = p; i < min(p + 3, n); ++i) {
a[u] = get(p, i);
if(a[u] >= 0 && a[u] <= 255) dfs(u + 1, i + 1);
}
}
vector<string> restoreIpAddresses(string s) {
str = s;
n = s.size();
res.clear();
dfs(0, 0);
return res;
}
};
如果传参,全部选择传入引用,这样代码看上去会很简洁,而且知道每个变量的作用
class Solution {
public:
int a[4];
int get(int l, int r, string &s) {
if(r - l > 0 && s[l] == '0') return -1;
int ans = 0;
for(int i = l; i <= r; ++i)
ans = ans * 10 + s[i] - '0';
return ans;
}
void dfs(int u, int p, string &s, vector<string> &res) {
if(u == 4) {
if(p >= s.size()) {
string tmp = to_string(a[0]);
for(int i = 1; i < 4; ++i) {
tmp += ".";
tmp += to_string(a[i]);
}
res.push_back(tmp);
}
return ;
}
for(int i = p; i < min(p + 3, (int)s.size()); ++i) {
a[u] = get(p, i, s);
if(a[u] >= 0 && a[u] <= 255) dfs(u + 1, i + 1, s, res);
}
}
vector<string> restoreIpAddresses(string s) {
vector<string> res;
dfs(0, 0, s, res);
return res;
}
};