题目描述
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
解题思路
利用回溯法的思想,从字符串第一个字符开始,分别检查从当前字符开始的第1、2、3位组成的数,若该数符合要求即小于256则加入到结果IP中,然后再从当前数的后一位置递归向后寻找。若遍历到第四个数,则判断最后几位组成的数是否满足要求,符合则加入到最后的集合中。注意当遇到当前数的起始位是0时,仅将0加入到字符串中就停止当前数的寻找,因为以‘0’开头的任何字符串转化成的数都会去掉前面的‘0’
代码
1 class Solution { 2 public: 3 vector<string> restoreIpAddresses(string s) { 4 vector<string> res; 5 findIp(s, 0, 0, "", res); 6 return res; 7 } 8 void findIp(string s, int f, int idx, string ip, vector<string> &res){ 9 if(idx == 3){ 10 if(s.size() - 1 - f < 3){ 11 if(s[f] == '0' && f != s.size() - 1) return; 12 int num = stoi(s.substr(f, s.size() - f)); 13 if(num < 256){ 14 ip += to_string(num); 15 res.push_back(ip); 16 } 17 } 18 } 19 else{ 20 for(int i = 1; i <= 3; i++){ 21 if(f + i >= s.size()) break; 22 int num = stoi(s.substr(f, i)); 23 if(num < 256) 24 findIp(s, f + i, idx + 1, ip + to_string(num) + ".", res); 25 if(s[f] == '0' && i == 1) break; 26 } 27 } 28 } 29 };