好久没有更新了。最近在看stl源码解析。所以没有太做题了。顺便说下这本书,乍一看感觉很难,仔细看几天收获还是不错。只能感叹c++泛型机制好流弊。。。leetcode上面也就做了50个。
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)
题意很简单就是找出所有能表示ip地址的串。这题太明显是个深搜了。只不过有几个细节需要处理。比如025不能出现在一个字节上。(25才可以)
深搜结束是到达字符串结束并且能够组成4个字节的ip地址。th为当前字节,k是搜索的位置。这里深搜的几个条件说一下,当前字节满足大于2位是0位置上不能是0,而且数字要在0和255之间。然后就可以一直搜下去了。当然还要注意下恢复字符串。
vector<string> ss;
int fun(string s)
{
int n=s.size();
int sum=0;
int i=0;
while(i<n)
{
sum=sum*10+s[i]-'0';
i++;
}
return sum;
}
void dfs(string s ,int k,int th,int n,string res)
{
if(th>4 && k==n)
{ ss.push_back(res);
return ;
}
if(th>4 && k<=n-1)
return ;
for(int i=0;i<3 && k+i<=n-1;i++)
{
string t(s.begin()+k,s.begin()+k+i+1);
if(t[0]=='0'&&t.size()>1)
continue;
if(fun(t)>=0 &&fun(t)<=255)
{
int c=res.size();
res+=t;
if(th!=4)
res.push_back('.');
dfs(s,k+i+1,th+1,n,res);
res.resize(c);
}
}
}
vector<string> restoreIpAddresses(string s) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
ss.clear();
int n=s.size();
dfs(s,0,1,n,"");
return ss;
}
如果大家发现不对的地方请指正谢谢。
最后希望赶紧发自己的小论文,好蛋疼。。