Leetcode: restore ipAddress 恢復ip地址,找出所有可能性
阿新 • • 發佈:2019-01-24
給出一個只包含數字的字串,找出它所有可能的合法的IP地址。
比如給出 "25525511135",
那麼就返回 ["255.255.11.135","255.255.111.35"]
解題的思路考慮的是backtrack回溯法,首先要有一個valid函式判斷當前納入的字串是否符合ip的規範0-255之間,如果符合,繼續尋找下一個,如果不符合的話,就需要返回到上一次的結果,再嘗試另外的可能性。
vector<string> restoreIpAddresses(string s) { vector<string> result; int len = s.length(); if(index >= len) return; if(len > 12 || len < 4) return result; string tmp = ""; // start from the first one int num = 1; restore(s,0,num,result,tmp); } void restore(string s, int index, int num, vector<string>& result,string tmp) { int len = s.length(); if(num >= 4) { if(len - index <= 3 && len - index > 0) { int k = len - index; if(valid(s.substr(index,k))) { tmp += s.substr(index,k); result.push_back(tmp); } } else return; } else{ tmp += s.substr(index,1);//單個數字的情況 tmp += '.'; restore(s,index+1,num+1,result,tmp); tmp = tmp.substr(0,tmp.length()-2); if(s[index] != '0'){//兩個數字 tmp += s.substr(index,2); tmp += '.'; restore(s,index+2,num+1,result,tmp); } tmp = tmp.substr(0,tmp.length()-3); string tmp1 = s.substr(index,3);//三個數字 if(tmp1.length() == 3 && valid(tmp1)) { tmp += s.substr(index,3); tmp += '.'; restore(s,index+3,num+1,result,tmp); tmp = tmp.substr(0,tmp.length()-4); } } } bool valid(string s) { if(s.length() == 2) { if(s[0] == '0') return false; else return true; } if(s.length() == 1) return true; int num = 0; for(int i = 0 ; i < 3; i++) num += (s[i] - '0')*pow(10,2-i); if(num <= 255 && num >= 100) return true; return false; }