回溯分割字符串。用'.'的个数作为递归返回条件。
class Solution {
public:
/**
*
* @param s string字符串
* @return string字符串vector
*/
bool is_valid(const string& s,int start,int end){
if(start>end) return false;
if(s[start]=='0' && start!=end) return false;
int val=0;
for(int i=start;i<=end;i++){
if(s[i]>'9' || s[i]<'0') return false;
val=10*val + (s[i]-'0');
if(val>255) return false;
}
return true;
}
void backtrack(string& s,vector<string>& result,int index,int points){
if(points==3){
if(is_valid(s, index, s.size()-1)) result.push_back(s);
return;
}
for(int i=index;i<s.size();i++){
if(is_valid(s, index, i)){
s.insert(s.begin()+i+1, '.');
points++;
backtrack(s, result, i+2, points);
points--;
s.erase(s.begin()+i+1);
}
else break;
}
}
vector<string> restoreIpAddresses(string s) {
vector<string> result{};
backtrack(s, result, 0, 0);
return result;
}
};