復原IP地址
阿新 • • 發佈:2018-12-16
題目
給定一個只包含數字的字串,復原它並返回所有可能的 IP 地址格式。
示例:
輸入: “25525511135”
輸出: [“255.255.11.135”, “255.255.111.35”]
答案
體會
這道題理解起來不難,但對於我來說難在程式碼實現,特別是對於程式碼中遞迴的理解。
於是,利用除錯工具,對程式碼一行行進行除錯,大概能明白程式碼完成了什麼功能,
不過還是有一點疑惑。再接再厲。
接下來,我有按照迭代的方法實現了一遍,如下所示:
遞迴過程
遞迴程式碼實現
// // Created by HINTS on 2018/12/11. // #include <iostream> #include <string> #include <vector> using namespace std; bool isValid(string s){ if(s.empty() || s.size() > 3 || (s.size() > 1 && s[0] =='0')){ return false; } int res = atoi(s.c_str()); return res <= 255 && res >= 0; } void restore(string s, int k, string out, vector<string> &res){ if(k == 0){ if(s.empty()) res.push_back(out); }else{ for (int i = 1; i <= 3; ++i) { if(s.size() >= i && isValid(s.substr(0, i))){ if (k == 1) restore(s.substr(i), k - 1, out + s.substr(0, i), res); else restore(s.substr(i), k - 1, out + s.substr(0, i) + ".", res); } } } } vector<string> restoreIpAddresses(string s) { vector<string> res; restore(s, 4, "", res); return res; } int main(){ string s = "25525511135"; vector<string> vs = restoreIpAddresses(s); for(auto c : vs){ cout << c << endl; } cout << s.substr(1); return 0; }
迭代程式碼實現
熟悉前面的過程之後,我按照自己的思路將前面的遞迴實現轉換為迭代實現,具體程式碼如下:
//迭代實現 vector<string> restoreIpAddresses2(string s) { vector<string> res; for (int i = 0; i < 3; ++i) { string s1 = s.substr(0, i+1); if(!isValid(s1)) continue; for (int j = i+1; j < i+4; ++j) { if(j+1 >= s.size())//解決“0000”這種長度小於9的型別 break; string s2 = s.substr(i+1, j-i); if(!isValid(s2)) continue; for (int k = j+1; k < j+4; ++k) { if(k+1 >= s.size()) //解決“0000”這種長度小於9的型別 break; string s3 = s.substr(j+1, k-j); string s4 = s.substr(k+1); //cout << s3 << " " << s4 <<endl; if(!isValid(s3) || !isValid(s4)) continue; res.push_back(s1 + "." +s2 + "." + s3 + "." +s4); } } } return res; }