题目:
给一个由数字组成的字符串。求出其可能恢复为的所有IP地址。
如:给出字符串 "25525511135",
所有可能的IP地址有两种:
"255.255.11.135",
"255.255.111.35"
(顺序无关紧要)
代码:
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <sstream>
using namespace std;
bool isValid(string s)//判断每一段是否合法。
{
if(s.size() > 1 && s[0] == '0')//如果首位为0,则IP地址不合法。
return false;
int res = atoi(s.c_str());//将字符型的数组转化为数字型数组。
return res <= 255 && res >= 0;
}
void DFS(string s, string tmp, int num, vector<string> &result)
{
if(num == 3 && isValid(s))//递归结束条件。
{
result.push_back(tmp+s);//每完成一个结果就将结果加入到容器中。
return;
}
//可以取1-3个字符
for(int i = 1; i <= 3 && i < s.size(); ++i) //特别需要注意i<s.size()
{
string subs = s.substr(0, i);//顺序获取s中长度为i的字符串。
if(isValid(subs))//如果这段合法,递归寻找下一段,直到所有4段都完成,即num=3,否则这一段位数加一再进行尝试。
DFS(s.substr(i), tmp+subs+".", num+1, result);
}
}
int main()
{
string s;
cout<<"请输入任意数字串: "<<endl;
while(cin >> s)
{
vector<string> result;
if(s.size() < 4 || s.size() > 12)//不符合IP地址要求
{
cout<<"输入IP地址不合法"<<endl;
return 0;
}
DFS(s, "", 0, result);
cout<<"共有"<<result.size()<<"个合法结果: "<<endl;
for(int i = 0; i < result.size(); ++i)
{
cout<<"第"<<i+1<<"个结果为:";
cout << result[i] << endl;
}
}
return 0;
}