LeetCode算法系列:93.Restore IP Addresses
阿新 • • 發佈:2018-12-14
題目描述
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
Example:
Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]
演算法實現
這個問題首先要理解什麼是有效的IP地址:
- 一個有效的IP地址被"."分為四段
- 如果一個段包含3個字元,那麼這三個字元不能大於”255”,這是ip地址的基本知識;
- 如果一個字元包括2個或3個字元,它的第一個字元不能為0。
採用回溯法,分別判斷從剩餘字元中拿出第一個字元,前兩個字元,前三個字元能不能組成一段,且剩餘的字元能不能組成剩餘的段數
//一個有效的IP地址被"."分為四段 //如果一個段包含3個字元,那麼這三個字元不能大於”255”,這是ip地址的基本知識; //如果一個字元包括2個或3個字元,它的第一個字元不能為0。 class Solution { public: vector<string> res; vector<string> oneres; vector<string> restoreIpAddresses(string s) { if(s.empty())return res; resIp(s,0,4); return res; } //st為當前段開始的索引,c為剩餘字元應該分配的段數 void resIp(string s, int st, int c){ // cout << st << "," << c << endl; if(s.length() - st > 3*c || s.length() - st < 1*c)return; //如果剩餘字元分得一段,那麼需要判斷這一段能否滿足要求,若滿足要求則生成一種解決方案,否則退出進行回溯 if(c == 1){ int suanz = 0; if(st == s.length() - 1 || s[st] != '0'){ for(int i = s.length() - 1; i >= st; i --){ int d = pow(10,s.length() - 1 - i); suanz += d * (s[i] - '0'); } if(suanz <= 255){ string stringres; for(auto c:oneres){ stringres += c; stringres += '.'; } stringres += s.substr(st); res.push_back(stringres); } } return; } //如果剩餘字元可以分得的段數大於1段,分別判斷從剩餘字元中拿出第一個字元,前兩個字元,前三個字元能不能組成一段 oneres.push_back(s.substr(st,1)); resIp(s, st + 1, c - 1); oneres.pop_back(); if(s[st] != '0' && st < s.length() - 2){ oneres.push_back(s.substr(st,2)); resIp(s, st + 2, c - 1); oneres.pop_back(); if(st < s.length() - 3 && (s[st] - '0')*100 + (s[st + 1] - '0')*10 + s[st + 2] - '0' <= 255){ oneres.push_back(s.substr(st,3)); resIp(s, st + 3, c - 1); oneres.pop_back(); } } } };