忙碌但是莫名其妙的六月,終於又可以刷題了,六月六月慢一點…
DFS
dfs(string s,string tmp,int word)
s是剩餘需要分割的字符串 tmp是已經分割好的字符串 word是已經分割出的ip地址數目,用於結束遞歸,確定正確結果
class Solution {
public:
vector<string> res;
vector<string> restoreIpAddresses(string s) {
string tmp;
dfs(s,tmp,0);
return res;
}
void dfs(string s,string tmp,int word)
{
if(word>4)return;
if(word==4&&s=="")
res.push_back(tmp);
else
{
if(tmp!="") tmp+='.';
for(int i=1;i<=3&&i<=s.size();i++)
{
if(valid(s.substr(0,i)))
{
string t=tmp+s.substr(0,i);
dfs(s.substr(i,s.size()-i),t,word+1);
}
}
}
}
bool valid(string str)
{
if(str.size()==1)
return true;
if(str.size()==0||str[0]=='0')
return false;
int num=atoi(str.c_str());
if(num>=0&&num<=255)
return true;
else
return false;
}
};
回溯算法
其實dfs也是一個大樹往下遞歸延展。
如果把for循環中的重新創建字符串t這個操作改爲【進入循環tmp改變-->dfs-->tmp變回原樣-->循環】就是熟悉的回溯算法啦
for(int i=1;i<=3&&i<=s.size();i++)
{
if(valid(s.substr(0,i)))
{
string t=tmp+s.substr(0,i);
dfs(s.substr(i,s.size()-i),t,word+1);
}
}