题目:
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)
思路:
典型的DFS
代码1:
class Solution {
public:
vector<string> restoreIpAddresses(string s)
{
vector<string> result;
string ip;
DFS(s,0,0,ip,result);
return result;
}
void DFS(string s , int start , int step , string ip , vector<string> &result)
{
//找到一个合法的ip
if(s.size() == start && step == 4)
{
ip.resize(ip.size() - 1);//把最后一个'.'去掉
result.push_back(ip);
return;
}
//如果剩余的数字很少
if(s.size() - start < 4 - step)
return ;
//如果剩余的数字很多
if(s.size() - start > (4 - step) * 3)
return ;
int num = 0;
for(int i = start ; i < start + 3 ; i++)
{
num = num * 10 + s[i] - '0';
if(num <= 255)
{
ip += s[i];
DFS(s,i+1,step+1,ip+'.',result);
}
//如果当前num为0,则结束,避免出现'00''01''02'这种的(不合法),比如192.168.01.1
if(num == 0)
break;
}
}
};代码2:
class Solution {
public:
vector<string> restoreIpAddresses(string s)
{
vector<string> result;
if(s.size() < 4 || s.size() > 12)
return result;
for(int i = 1 ; i < 4 ; i++)
{
string first = s.substr(0,i);
if(!isValid(first))
continue;
for(int j = 1 ; j < 4 && i+j < s.size(); j++)
{
string second = s.substr(i,j);
if(!isValid(second))
continue;
for(int k = 1 ; k < 4 && i+j+k < s.size(); k++)
{
string third = s.substr(i+j,k);
string last = s.substr(i+j+k);
if(isValid(third) && isValid(last))
{
string ip = first + '.' + second + '.' + third + '.' + last;
result.push_back(ip);
}
}
}
}
return result;
}
bool isValid(string s)
{
//如果字符串长度> 1 ,且首字符为0,则非法
if(s.size() > 1 && s[0] == '0')
return false;
if(stoi(s) >= 0 && stoi(s) < 256)
return true;
else
return false;
}
};
本文介绍了如何通过深度优先搜索(DFS)算法解决给定数字字符串还原为所有可能的有效IP地址的问题,包括代码实现和详细步骤。
1913

被折叠的 条评论
为什么被折叠?



