力扣练习——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; }

浙公网安备 33010602011771号