思路
回溯(backtracing),用s的起始位置pos表示当前的状态(pos之前的已经处理完)。那么就依次尝试1~3位的字符看看是否符合要求,符合就把结果更新到buffer里,未完成就递归继续,然后递归返回的时候记得把buffer恢复到之前的状态。
按照题目的意思,应该不允许IP地址有前导0,即01.01.01.01这种状态.
对了,stoi函数很好用,应该是C++11新加的。
代码
class Solution { public: bool isValidSubAddr(const string& s, int pos, int len){ if(pos + len > s.size()) return false; int val = stoi(s.substr(pos, len)); if(val >= 0 && val <= 255){ if(val < 10 && len > 1) return false; else if(val < 100 && len > 2) return false; return true; } return false; } void restoreSub(vector<string>& results, const string& s, int pos, int remainingDot, string& buffer){ if(remainingDot == 0 || pos >= s.size()) return; int buffSize = buffer.size(); for(int len=1; len<=3; len++){ if(!isValidSubAddr(s, pos, len)) continue; buffer += s.substr(pos, len); if(pos + len == s.size()){ //one solution if(remainingDot == 1) //otherwise, the split cannot be finished results.push_back(buffer); } else { buffer += "."; //continue try restoreSub(results, s, pos+len, remainingDot-1, buffer); } buffer.erase(buffSize); //restore state } } vector<string> restoreIpAddresses(string s) { vector<string> results; if(s.empty()){ return results; } string buffer; restoreSub(results, s, 0, 4, buffer); return results; } };