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);
    }
};

 

posted @ 2015-01-20 16:02  smileheart  阅读(114)  评论(0)    收藏  举报