LeetCode 93 复原 IP 地址 - 回溯解法
https://leetcode.cn/problems/restore-ip-addresses/description/
与[分割回文串](LeetCode 131 分割回文串 - 回溯解法.md) 类似, 不断的从前面拿到一个 合法的 **ip加入到path中, 直到走到最后. **
每回拿到的长度应该为 1-3
for(int len = 1;len<=3;len++){ 这里可能 index+len>max 也要限制一下
left = loc.substr(index,len)
if(left 合法){
path.push(left)
add_path(index+len)
path.pop();
}
}
返回条件和 回文串 一样
当前面都加到 path 中后, 此时就应该返回了.
代码
class Solution {
public:
vector<string> path;
vector<string> result;
string loc_string;
void add_path(int index) {
if (path.size() > 4)
return;
if (index == loc_string.size() && path.size() == 4) {
string tmp = path[0];
for (int i = 1; i < 4; ++i) {
tmp += '.' + path[i];
}
result.push_back(tmp);
return;
}
for (int len = 1; len <= 3 && index + len <= loc_string.size(); len++) {
string left = loc_string.substr(index, len);
if (left[0] == '0' && len > 1) {
// 这里 一旦触发 continue 后面的循环一定会continue, 可以直接 break.
continue;
}
if(stoi(left)>255) break;
path.push_back(left);
add_path(index + len);
path.pop_back();
}
}
vector<string> restoreIpAddresses(string s) {
loc_string = s;
add_path(0);
return result;
}
};
总结
👍 将["225","2","33","55"]转换为225.2.33.55 时, 使用循环直接套四层循环不够美观, 注意到需要额外处理的位置只会出现在首尾, 因此可以直接令tmp 等于首部, 这样少一层循环且美观.
👍 处理break. 当第一个数为0时, 接下来的循环都是应该跳过的, 因此直接break; 当左边大于255时, 接下来的循环也一定大于255,因此直接break.