题目链接:https://leetcode.com/problems/restore-ip-addresses/?tab=Description
题目大意:给定一个字符串,字符串只包含数字,要求返回所以合法的IP地址组合。
思路:IP地址由四个字节组成,每个字节表示的整数范围为0-255,所以需要把字符串分成四个部分,在所有分法中找出合法的划分即可。
算法步骤:1、初始化一个vector<string>,用于保存合法IP;2、构造获取所有组合方式的循环,并判断每种组合是否合法,如果合法,保存到vector中;3、返回vector;
算法复杂度:时间复杂度为O(1),空间复杂度为O(n)
代码:
递归版本
1 class Solution { 2 public: 3 vector<string> restoreIpAddresses(string s) { 4 return subRestoreIpAddresses(s, 1); 5 } 6 vector<string> subRestoreIpAddresses(string s, int num) { 7 vector<string> res; 8 if (num == 4) { 9 if (isValid(s)) { 10 res.push_back(s); 11 } 12 } 13 else { 14 for (decltype(s.size()) i = 1; i < s.size() && i <= 3; ++i) { 15 string pre_byte = s.substr(0, i); 16 if (!isValid(pre_byte)) 17 continue; 18 vector<string> tmp = subRestoreIpAddresses(s.substr(i), num + 1); 19 for (auto s : tmp) 20 res.push_back(pre_byte + '.' + s); 21 } 22 } 23 return res; 24 } 25 bool isValid(const string s) { 26 if (s.size() > 1) { 27 if (s[0] == '0' || s.size() > 3) 28 return false; 29 if (strToInt(s) > 255) 30 return false; 31 } 32 return true; 33 } 34 int strToInt(const string s) { 35 int res = 0; 36 for (decltype(s.size()) i = 0; i < s.size(); ++i) { 37 res = res * 10 + (s[i] - '0'); 38 } 39 return res; 40 } 41 };
非递归版本
1 class Solution { 2 public: 3 vector<string> restoreIpAddresses(string s) { 4 vector<string> res; 5 if (s.size() < 4) 6 return res; 7 for (decltype(s.size()) i = 1; i < 4 && i <= s.size() - 3; ++i) 8 for (auto j = i + 1; j < i + 4 && j <= s.size() - 2; ++j) 9 for (auto k = j + 1; k < j + 4 && k <= s.size() - 1; ++k) { 10 string byte1 = s.substr(0, i), byte2 = s.substr(i, j - i); 11 string byte3 = s.substr(j, k - j), byte4 = s.substr(k); 12 if (isValid(byte1) && isValid(byte2) && isValid(byte3) && isValid(byte4)) { 13 res.push_back(byte1 + '.' + byte2 + '.' + byte3 + '.' + byte4); 14 } 15 } 16 return res; 17 } 18 bool isValid(const string s) { 19 if (s.size() > 1 && s[0] == '0') 20 return false; 21 if (s.size() > 3 || strToInt(s) > 255) 22 return false; 23 return true; 24 } 25 int strToInt(const string s) { 26 int res = 0; 27 for (auto c : s) 28 res = res * 10 + c - '0'; 29 return res; 30 } 31 };
评测系统上运行结果: