37 复原IP地址
1.问题描述
给定一个只包含数字的字符串,复原它(在中间插入点号)并返回所有可能的 IP 地址格式,输出可能的格式的数量。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间)组成,整数之间用 ‘.’ 分隔。
示例:
输入: “25525511135”
输出: 2
说明:因为可能的IP地址包括:[“255.255.11.135”, “255.255.111.35”]
2.输入说明
输入一个只包含数字的字符串
3.输出说明
输出一个整数
4.范例
输入
25525511135
输出
2
5.代码
#include <iostream>
#include <queue>
#include <cstdlib>
#include <string>
#include<set>
using namespace std;
vector<string> ans;
vector<string> path; // 保存ip地址的每一个段
int n;
//检查IP段是否合法
bool check(string num) {
// 检测前导0
if (num.size() > 1 && num[0] == '0')
return false;
//stoi 实现string to integer
return stoi(num) <= 255; // 每个部分均小于等于255
}
void backtracking(string s, int start, int cnt) {
if (cnt == 4 && start == n) {
if (start < n) return; // 已经有四段了,但数字没有用完,剪枝
ans.push_back(path[0] + '.' + path[1] + '.' + path[2] + '.' + path[3]);
return;
}
for (int len = 1; len <= 3 && start + len - 1 < n; len++) { // 每个数字部分位数 1-3
string num = s.substr(start, len);
if (check(num)) {
path.push_back(num);
backtracking(s, start + len, cnt + 1);
path.pop_back();
}
}
}
vector<string> restoreIpAddresses(string s)
{
n = s.size();
if (n > 12) return ans; // 最多12位
backtracking(s, 0, 0);
return ans;
}
int main()
{
vector<string>res;
string s;
cin >> s;
res = restoreIpAddresses(s);
cout << res.size() << endl;
return 0;
}