力扣:复原IP地址

题目:将只包含数字的字符串,复原并返回所有可能的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;    
    }
 };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值