题目:将只包含数字的字符串,复原并返回所有可能的IP地址 (每个整数都在’0~255’之间)
例如:
输入:“25525511135”
输出:“255.255.11.135”,“255.255.111.35”
思路:递归
由于需要给出所有可能的IP地址,所以每一段需要所有可能都需要进行搜索,最终输出满足要求的IP地址。
因为IP地址一般有4个字段,所以可以分成四段进行搜索,在段内搜索满足条件的可能情况,依次迭代递归到下一段。
函数可以设计成dfs(id,idstart),id={0,1,2,3},s[idstrat]表示每段id的开始位置,idend表示每段id的结束位置。搜索完第一段后递归dfs(id+1,idend+1),依次递归直到整个字符串搜索结束。
*注意点:*由于可能出现0字符在id段的最开始,由于IP地址字段中没有0开始的字段,所以此时0字符自成一段。
std::move 将对象的状态或所有权从一个对象转移到另一个对象,只是转移,无内存搬迁或者内存拷贝。
class Solution {
private:
vector<string>res;
vector<int>re;
public:
void dfs(const string& s,int id,int idstart)
{ //如果搜索到最后,id=4并且idstart=s.size()的时候,则搜索完毕得到一种情况
if(id==4)
{
if(idstart==s.size())
{
string ip;
for(int i=0;i<4;++i)
{
ip+=to_string(re[i]);
if(i!=3)ip+='.';
}
res.push_back(move(ip));
}
return ;
}
if(idstart==s.size())return ;//没有完成4段搜索已到达结束,返回
//如果0为字段的开始的情况
if(s[idstart]=='0')
{
re[id]=0;
dfs(s,id+1,idstart+1);
}
//正常搜索
int idaddr=0;
for(int idend=idstart;idend<s.size();++idend)
{
idaddr=idaddr*10+(s[idend]-'0');
if(idaddr>0&&idaddr<=255)//此处注意是大于0,若大于等于则会一直进入if循环,递归4*4=16次,输入0000时,则会出现16组0.0.0.0
{
re[id]=idaddr;
dfs(s,id+1,idend+1);
}
else break;
}
}
vector<string> restoreIpAddresses(string s)
{ re.resize(4);//不加会出现runtime error: reference binding to null pointer of type 'struct value_type' (stl_vector.h)的问题
dfs(s,0,0);
return res;
}
};