93. 复原 IP 地址
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
示例 1:
输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]
示例 2:
输入:s = “0000”
输出:[“0.0.0.0”]
示例 3:
输入:s = “101023”
输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]
提示:
1 <= s.length <= 20
s 仅由数字组成
class Solution {
public:bool isSubValid(string &subip) {if (subip.size() > 3 || subip.at(0) == '0' && subip.size() > 1) {return false;} return atoi(subip.c_str()) <= 255;}bool isValid(string &ip) {string tmpip = ip;tmpip.push_back('.');string tmp;for (int i = 0; i < tmpip.size(); i++) {if (tmpip.at(i) == '.') {if (isSubValid(tmp)) {tmp.clear();continue;} else {return false;}}tmp.push_back(tmpip.at(i));}return true;}string buildIpAddress(string &ip, vector &split) {string ipaddr;for (int i = 0, k = 0; i < ip.size(); i++) {if (k < split.size()) {ipaddr.push_back(ip.at(i));if (i == split[k]) {ipaddr.push_back('.');k++;}} else {ipaddr += ip.substr(i, ip.size());break;}}return ipaddr;}void dfs(vector &ans, vector &sploc, string s, int index) {if (sploc.size() == 3) {string ipaddr = buildIpAddress(s, sploc);if (isValid(ipaddr)) {ans.push_back(ipaddr);}}for (int i = index; i < s.size() - 1; i++) {if (sploc.empty() && i > 3) {break;}if (!sploc.empty() && i - sploc[sploc.size() - 1] > 3) {break;}sploc.push_back(i);dfs(ans, sploc, s, i + 1);sploc.pop_back();}}vector restoreIpAddresses(string s) {vector ans;vector sploc;dfs(ans, sploc, s, 0);return ans;}
};
上一篇:【标准的产品解决方案】Softerra与上海道宁为IT行业提供优质且全面的解决方案,帮助世界各地的企业应对严苛的IT挑战
下一篇:最新或2023(历届)韶关学院录取通知书发放时间及开学时间和新生入学指南军训须知 2023韶关学院定向提前批 韶关学院2023录取分数线