1. 程式人生 > 其它 >leetcode 復原 IP 地址 中等

leetcode 復原 IP 地址 中等

如果 s.size() > 12 或者 < 4, 直接 return, 這個無話可說..

然後就是列舉四個點的位置, 判斷每個部分是否含字首 0 和是否小於 255 即可。

如,第一部分只可能是 下標為 i ∈ [0, 2],然後第二部分則為 j ∈ [i + 1, i + 3],第四部分為 k ∈ [sz - 3, sz - 1],第三部分則是剩餘的。

然後其實這樣列舉可能出現越界的問題,比如給出字串總長度為 4, i 的邊界實際上到不了 2。但是不在 for 迴圈範圍中處理邊界,使用計算這個部分的大小來判斷是否合法,即程式碼中的 sz1, sz2, sz3, sz4.

class
Solution { public: vector<string> restoreIpAddresses(const string &s) { if(s.size() > 12 || s.size() < 4) return {}; vector<string> ret; int sz = s.size(); for(int i = 0; i <= 2; ++ i) { // [0, i] 第一部分 for(int j = i + 1; j <= i + 3
; ++ j) { // [i + 1, j] 為第二部分 for(int k = sz - 1; k >= sz - 3; -- k) { // [k, sz - 1] 為第四部分, [j + 1, k - 1] 為第三部分 int sz1 = i + 1, sz2 = j - (i + 1) + 1; int sz3 = (k - 1) - (j + 1) + 1, sz4 = sz - 1 - k + 1; if(!check(s, 0
, sz1) || !check(s, i + 1, sz2) || !check(s, j + 1, sz3) || !check(s, k, sz4)) continue; string tmp; insert(s, tmp, 0, sz1); tmp.push_back('.'); insert(s, tmp, i + 1, sz2); tmp.push_back('.'); insert(s, tmp, j + 1, sz3); tmp.push_back('.'); insert(s, tmp, k, sz4); ret.emplace_back(std::move(tmp)); } } } return ret; } private: bool check(const string &s, int i, int sz) { if(sz <= 0) return false; if(sz > 1 && s[i] == '0') return false; // 前導 0 int num = 0; for(int j = i; j < i + sz; ++ j) { num = num * 10 + (s[j] - '0'); } return num <= 255; } void insert(const string &s, string &tmp, int i, int sz) { for(int j = i; j < i + sz; ++ j) { tmp.push_back(s[j]); } } };