【道德经·第二十六章】 重为轻根,静为躁君。是以君子终日行不离辎重,虽有荣观,燕处超然。奈何万乘之主,而以身轻天下?轻则失根,躁则失君。
有效IP地址 正好由四个整数(0到255,不含前导 0),整数之间用 ‘.’ 分隔。
示例 1:
1 2
   | 输入:s = "25525511135" 输出:["255.255.11.135","255.255.111.35"]
   | 
 
示例 2:
1 2
   | 输入:s = "0000" 输出:["0.0.0.0"]
   | 
 
示例 3:
1 2
   | 输入: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仅由数字组成
 
回溯法一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | vector<string> restoreIpAddresses(string s) {     vector<string> res;     helper(s, res, "", 0);     return res; }
  void helper(string s, vector<string>& res, string out, int n) {     if(n == 4) {         if(s.empty()) res.push_back(out);         return;     }
      for(int k = 1; k < 4; k++) {         if(s.size() < k) break;         int val = stoi(s.substr(0, k));         if(val>255 || k!=std::to_string(val).size()) continue;         helper(s.substr(k), res, out+s.substr(0, k)+(n==3 ? "":"."), n+1);     } }
  | 
 
回溯法二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   | void dfs(string& s, vector<string>& res, string& cur, int step, int index) {     if(step == 4) {         if(index != s.size()) return;         res.push_back(cur);         return;     }
      string t1 = "";     for(int i = index; i<index+3 && i<s.size(); i++) {         t1 += s[i];         int num = stoi(t1);         string t2 = cur;         if(num<=255 && (t1.size()==1 || t1[0]!='0')) {             cur += t1;             if(step != 3) cur += ".";             dfs(s, res, cur, step+1, i+1);             cur = t2;         }     } }
  vector<string> restoreIpAddresses(string s) {     vector<string> res;     string cur;     dfs(s, res, cur, 0, 0);     return res; }
  | 
 
迭代法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   | vector<string> restoreIpAddresses(string s) {     vector<string> res;     for(int a = 1; a < 4; a++)     for(int b = 1; b < 4; b++)     for(int c = 1; c < 4; c++)     for(int d = 1; d < 4; d++)          if(a+b+c+d == s.size()) {             int va = stoi(s.substr(0, a));             int vb = stoi(s.substr(a, b));             int vc = stoi(s.substr(a+b, c));             int vd = stoi(s.substr(a+b+c, d));             if(va<=255 && vb<=255 && vc<=255 && vd<=255) {                 string t = to_string(va) + "." + to_string(vb) + "." + to_string(vc) + "." + to_string(vd);                 if(t.size() == s.size()+3) res.push_back(t);             }         }
      return res;      }
  | 
 
位我上者,灿烂星空;道德律令,在我心中。