93. Restore IP Addresses

题目链接: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 };

评测系统上运行结果:

posted @ 2017-03-10 22:14  小谷子的博客园  阅读(125)  评论(0编辑  收藏  举报