题目地址
https://leetcode.com/problems/restore-ip-addresses/
题目大意
给一串全是数字的字符串,在其中添加三个.
使其成为合法的点分十进制IP地址,返回所有的可能。
解题思路
将字符串分成两个部分,前半部分为0-255之间的数字。后半部分递归处理,直到将字符串分成4个部分,然后判断是否为合法的IP地址。
这其中要注意,多个00的情况和以0开头的字符串的情况。
代码
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> result;
small(s, "", 1, result);
return result;
}
void small(const string & remain, const string & prefix, int part, vector<string> & result) {
if (remain.size() == 0) {
return;
}
if (part == 4) {
if (remain.size() > 3) {
return;
}
if (!is_valid(remain)) {
return;
}
result.push_back(prefix + remain);
return;
}
for (int i = 1; i <= 3 && i < remain.size(); ++i) {
string prefix_tmp = remain.substr(0, i);
if (!is_valid(prefix_tmp)) {
break;
}
prefix_tmp = prefix + prefix_tmp + ".";
string remain_tmp = remain.substr(i);
small(remain_tmp, prefix_tmp, part + 1, result);
}
return;
}
bool is_valid(const string & s) {
int tmp = stoi(s);
if (tmp < 0 || tmp > 255) {
return false;
}
if (tmp != 0 && s[0] == '0') {
return false;
}
if (tmp == 0 && s.size() != 1) {
return false;
}
return true;
}
};