题目要求:输入一串字符串,输出可能组成的ip地址。
先申请题意,弄清需求:
会存在不是数字的字符串吗?===都是数字
10.10.10.01 最后一个01,符合要求吗?====不符合要求。
leetcode上的示例答案:用的DFS
class Solution1 {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> res;
vector<string> tmp;
int count = 0;
int n = s.length();
solve(res, tmp, s, 0, 0, n);
return res;
}
// res 存的 是每次找到的有效的最终 ip 地址,即结果
// tmp 存的 某次查找的时候 ,每个 ip 段,最终ip 由 四段组成。
// s 即输入字符串一直没变
// count 表示当前 tmp 中的 ip段 个数
// start 表示 从s的位置索引开始找有效ip部分
// n 表示 s的长度 一直不变
void solve(vector<string>& res, vector<string>& tmp, string& s, int count, int start, const int n)
{
if (count == 4)
{
if (start == n)
{
string t = "";
for (int i = 0; i < 3; i++)
{
t += tmp[i] + ".";
}
t += tmp[3];
res.push_back(t);
}
return;
}
if (start == n)
{
return;
}
for (int i = start; i < n; i++)
{
if (i + 1 - start > 3)
{
return;
}
string t = string(s.begin() + start, s.begin() + i + 1);
if (t.length() > 1 && t[0] == '0')
{
return;
}
int e = stoi(t);
if (e <= 255)
{
count++;
tmp.push_back(t);
solve(res, tmp, s, count, i + 1, n);
count--;
tmp.pop_back();
}
}
}
};
分析:
1.从前往后找,使用tmp进行暂存,如果已经找到四个ip段了,看是否正好走完string,如果是就存入res,否则不存入。使用回溯的方法进行继续查找。
2.int e = stoi(t); string转int的函数。 C++11中的增加的。
3.string t = string(s.begin() + start, s.begin() + i + 1); 使用迭代器进行初始化
template <class InputIterator>
string (InputIterator first, InputIterator last);
自己写的没贴代码了,就注意点:
1. stringstream 类所在头文件 <sstream>
2. bug:没有判断 strlen - i 是否大于等于0。导致数组越界。
string strCur = string(s, strlen - i, i);
3. bug:比如 12.7.0.01 这个ip的第四部分”01“不合法,应该排除掉。