從字串恢復IP地址C++遞迴實現。
阿新 • • 發佈:2018-11-26
題目:
給一個由數字組成的字串。求出其可能恢復為的所有IP地址。
如:給出字串 "25525511135",
所有可能的IP地址有兩種:
"255.255.11.135",
"255.255.111.35"
(順序無關緊要)
程式碼:
#include <iostream> #include <vector> #include <fstream> #include <algorithm> #include <sstream> using namespace std; bool isValid(string s)//判斷每一段是否合法。 { if(s.size() > 1 && s[0] == '0')//如果首位為0,則IP地址不合法。 return false; int res = atoi(s.c_str());//將字元型的陣列轉化為數字型陣列。 return res <= 255 && res >= 0; } void DFS(string s, string tmp, int num, vector<string> &result) { if(num == 3 && isValid(s))//遞迴結束條件。 { result.push_back(tmp+s);//每完成一個結果就將結果加入到容器中。 return; } //可以取1-3個字元 for(int i = 1; i <= 3 && i < s.size(); ++i) //特別需要注意i<s.size() { string subs = s.substr(0, i);//順序獲取s中長度為i的字串。 if(isValid(subs))//如果這段合法,遞迴尋找下一段,直到所有4段都完成,即num=3,否則這一段位數加一再進行嘗試。 DFS(s.substr(i), tmp+subs+".", num+1, result); } } int main() { string s; cout<<"請輸入任意數字串: "<<endl; while(cin >> s) { vector<string> result; if(s.size() < 4 || s.size() > 12)//不符合IP地址要求 { cout<<"輸入IP地址不合法"<<endl; return 0; } DFS(s, "", 0, result); cout<<"共有"<<result.size()<<"個合法結果: "<<endl; for(int i = 0; i < result.size(); ++i) { cout<<"第"<<i+1<<"個結果為:"; cout << result[i] << endl; } } return 0; }