93. Restore IP Addresses
问题描述:
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
Example:
Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]
解题思路:
这个就是枚举并且判断是否是有效的。
核心的地方是:IP地址有4各部分,每个部分都要小于256,即[0, 255]。
我们可以从以下几个地方入手:
1.当前剩余字符串长度是否超过所给的最大长度? (1,2,3,4)
每个部分最长为3,若在对第1部分进行枚举,剩下的长度如果超过了3*3那么显然是不可能的
2.当前部分字符串传承数字后的值是否在有效范围内?
需要注意的是:
若当前字符串长度大于1且开头为0,是无效的:如01
代码:
class Solution { public: vector<string> restoreIpAddresses(string s) { vector<string> ret; int len = s.size(); if(len > 12) return ret; enumerate(ret, s, 4, ""); return ret; } private: void enumerate(vector<string> &ret, string s, int part, string cur){ if(part == 1){ if(validAdd(s)){ cur += s; ret.push_back(cur); } return; } for(int i = 1; i <= 3 && i < s.size(); i++){ string temp = cur; string add = s.substr(0, i); if(validAdd(add)){ temp += add+"."; string rest = s.substr(i); if(rest.size() <= ((part-1)*3)) enumerate(ret, rest, part-1, temp); } } } bool validAdd(string s){ if(s.size() > 3) return false; if(s.size() > 1 && s[0] == '0') return false; int num = 0; for(int i = 0; i < s.size(); i++){ num *= 10; num += s[i]-'0'; } return num < 256; } };