Restore IP Addresses (LeetCode)
Question:
https://oj.leetcode.com/problems/restore-ip-addresses/
典型的backtracking(DFS)解法。注意尽可能的减枝。Code里是在GetNumberThisSegment里实现减枝的。
比如:
1. 第一个字符是0的话,这一段IP必须是0, (minNumber=maxNumber=1).
2. maxNumber=3的时候,判断字符串是否大于255. 是的话减一。
3. 最后一节,maxNumber, minNumber满足以上条件的同时必须跟剩下来的字符数量相符。
4. minNumber <= maxNumber
class Solution { public: vector<string> restoreIpAddresses(string s) { // x.x.x.x // each x must be >=0 and <= 255. // back tracking vector<string> result; string ip; RestoreIP(result, ip, 0, s, 0); return result; } void RestoreIP(vector<string>& result, string& ip, int dotCount, string&s, int pos) { int minNumber; int maxNumber; if (!GetNumberThisSegment(s, pos, dotCount, maxNumber, minNumber)) return; if (dotCount == 3) { result.push_back(ip); result.back().append(s.substr(pos)); return; } for (int i = minNumber; i <= maxNumber; i++) { string newip = ip; newip.append(s.substr(pos, i)); newip.append("."); RestoreIP(result, newip, dotCount+1, s, pos+i); } } // Return false if invalid bool GetNumberThisSegment(string& s, int pos, int dotCount, int& maxNumber, int& minNumber) { if (pos == s.size()) return false; if (s[pos] == '0') { minNumber = 1; maxNumber = 1; } else { maxNumber = s.size()-pos - (3-dotCount); maxNumber= min(maxNumber, 3); minNumber = s.size()-pos - 3*(3-dotCount); minNumber = max(1, minNumber); } if (maxNumber == 3 && s.substr(pos, maxNumber) > "255") maxNumber --; if (dotCount == 3) { if (maxNumber != s.size()-pos || minNumber != s.size()-pos) return false; } return (minNumber <= maxNumber); } };
浙公网安备 33010602011771号