题目
这题主要是业务逻辑,基本思路和回溯差不多。
和这题很像:Leetcode 131. 分割回文串
代码(看解析)
class Solution {
public:
vector<string> res;
deque<string> track; // 用于回溯
vector<string> restoreIpAddresses(string s) {
backtrack(s, 0);
return res;
}
void backtrack(string s, int start) {
if(start == s.size() && track.size() == 4) {
res.push_back(join_track(track));
return;
}
for(int i = start; i < s.size(); i++) {
// 先判断是否合法
if(!is_valid(s, start, i))
continue;
// 不能再分解了
if(track.size() == 4)
break;
track.push_back(s.substr(start, i-start+1));
backtrack(s, i+1);
track.pop_back(); // 回溯
}
}
// 以下都是业务逻辑
bool is_valid(const string& s, int low, int high) { // 判断是否合法
int len = high - low + 1;
if(s[low] == '0' && len > 1) // 出现"0000"的情况
return false;
if(len > 3 || len == 0) { // 长度超了
return false;
}
if(stoi(s.substr(low, len)) > 255) { // stoi:字符串转int
return false;
}
return true;
}
string join_track(deque<string>& track) { // 把路径转化为字符串
string ans = "";
for(int i = 0; i < track.size(); i++) {
ans += track[i];
if(i < track.size() - 1) {
ans += ".";
}
}
return ans;
}
};
代码(8.26 二刷部分看解析)
class Solution {
public:
vector<string> res;
vector<string> track;
vector<string> restoreIpAddresses(string s) {
backtrack(s, 0);
return res;
}
void backtrack(string& s, int start) {
if(start == s.size() && track.size() == 4) {
res.emplace_back(join(track));
return;
}
int i = start;
for(; i < s.size(); i++) {
string str = s.substr(start, i-start+1);
if(!check(str)) {
continue;
}
if(track.size() == 4) {
break;
}
track.emplace_back(str);
backtrack(s, i + 1);
track.pop_back();
}
}
bool check(string s) {
if(s.size() > 3 || s.size() == 0)
return false;
if(s[0] == '0' && s.size() > 1)
return false;
int num = stoi(s);
if(num > 255)
return false;
return true;
}
string join(vector<string>& track) {
string ans = "";
for(string& arr : track) {
ans += arr;
ans += ".";
}
ans.pop_back();
return ans;
}
};
代码(10.7 三刷自解)
class Solution {
public:
vector<string> res;
vector<string> tmp;
vector<string> restoreIpAddresses(string s) {
backtrack(s, 0);
return res;
}
void backtrack(string s, int cur) {
if(tmp.size() == 4) {
if(cur == s.size()) {
string ans;
for(string& t : tmp)
ans += t + ".";
ans.pop_back();
res.emplace_back(ans);
}
return;
}
for(int i = cur; i < s.size(); i++) {
string sub = s.substr(cur, i-cur+1);
if(check(sub)) {
tmp.emplace_back(sub);
backtrack(s, i+1);
tmp.pop_back();
}
}
}
bool check(string s) {
if(s.size() > 1 && s[0] == '0')
return false;
if(s.size() > 3)
return false;
if(stoi(s) > 255)
return false;
return true;
}
};