虽然很难看,也就是排名30左右水平,但是起码是自己搓出来的,记录一下。。。。
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
if(4>s.size()) return vector<string>();
vector<size_t>(3,0).swap(dot_pos);
auto _size = s.size();
if(4==_size)
{
string ret;
for(auto& ele:s)
{
ret.push_back(ele);
ret.push_back('.');
}
ret.pop_back();
return vector<string>({ret});
}
counter=0;
helper(0,s);
return vreturn;
}
void helper(size_t pos,string &s)
{
if(3==counter)
{
if(isvalid(s.substr(dot_pos[2],s.size()-dot_pos[2])))
{
string tmp = s.substr(0,dot_pos[0]);
tmp.push_back('.');
tmp=tmp+s.substr(dot_pos[0],dot_pos[1]-dot_pos[0]);
tmp.push_back('.');
tmp=tmp+s.substr(dot_pos[1],dot_pos[2]-dot_pos[1]);
tmp.push_back('.');
tmp=tmp+s.substr(dot_pos[2],s.size()-dot_pos[2]);
vreturn.emplace_back(move(tmp));
}
return;
}
for(auto i=1;i<4;i++)
{
if(pos+i<s.size()&&isvalid(s.substr(pos,i)))
{
dot_pos[counter]=pos+i;
counter++;
helper(pos+i,s);
counter--;
}
}
}
bool isvalid(string str)
{
if(3<str.size()) return false;
auto dig = stoi(str);
if((1<str.size()&&0==dig)||(0!=dig&&str[0]=='0')||dig>255) return false;
return true;
}
vector<string> vreturn;
vector<size_t> dot_pos;
int counter;
};