Restore IP Addresses
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example:
Given"25525511135",return
["255.255.11.135", "255.255.111.35"]. (Order does not matter)tag: backtracking, string
花了我好久才搞通这题!
其实大方向是对的,带剪枝的回溯算法。先一个个插dot进去,发现不行后再返回上一层,逐个测试。
有三个点需要注意:
1. 传参数时,result是要随时被更改的,所以传参时要传它的引用。即使我是调用它的push_back()函数,也需要传引用,这个好奇怪。
2. substr的参数是(index, count)表示取[index, index + cout)的子字符串。开始我以为是[start, end)。结果改了好久,在本地上cout才测试出来。
3. stoi不能转换过长的字符串,否则会报RUN TIME ERROR 错误。所以我在stoi函数前,加了s.size() > 3 的判断。保证传给stoi的字符串不会过长,导致溢出。
4. IP每个域之间必须是一个小于等于255的有效非负整数。像是010这样就不合法,需要加以判定。
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> re;
_restoreIpAddresses(re, s, 0);
return re;
}
//depth: number of dot inserted, it can not be 3
void _restoreIpAddresses(vector<string> &result, string s, int depth){
if(depth == 3){//leaf node
int pos = s.find_last_of('.') + 1;
string lastPart = s.substr(pos);
if (lastPart.size() > 3 || lastPart.empty()){
return;
}
if(stoi(lastPart) <= 255){
if (lastPart[0] == '0' && lastPart.size() > 1){
return ;//string starts with '0' but is not '0'
}
else{
result.push_back(s);
}
}
}
else{
int pos = s.find_last_of('.') + 1;
for(int i = pos; i < pos + 3 && i < s.size(); i++){
if(s[pos] == '0' && i > pos){//string starts with '0' but is not '0'
return;
}
if(stoi(s.substr(pos, i -pos + 1)) <= 255){
s.insert(i + 1, ".");
_restoreIpAddresses(result, s, depth + 1);
s.erase(i + 1, 1);
}
}
}
}
};
