93.Restore IP Addresses

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

For example:
Given "25525511135",

return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)

 

这道题整了我很久,首先是一个老毛病犯了,又忘了区分字符'0'和数字0了,导致判断的时候出错,还有,最后结果的push

res.push_back( temp.substr(0,temp.size()-1));这样是对的,刚才出错是因为,temp=temp.substr(0,temp.size()-1);res.push_back(temp),这样子回溯的时候,会多删除一个。思路没错,就是因为这两个细节的错误导致这个程序调了很久。

 

整体思路就是深度优先搜索,首先看到边界条件没,如果没有,就深度搜索:

一开始搜索1个字符和剩下的字符串,判断该字符的index是否越界了,对于剩下的字符串递归;

然后是2个字符和剩下的字符串,判断这2个字符的首字符是否是0,对于剩下的字符串递归;

然后是3个字符和剩下的字符串,判断这3个字符的首字符是否是0,并且这3个字符组成的数字是否小于等于255,对于剩下的字符串递归。

class Solution {
private:
    vector<string> ret;
    vector<int> ipNums;
    static const int ipNumCnt = 4;
    static const int numLen = 3;
public:
    bool isValidIpNum(string s)
    {
        int len  = s.size();
        if(len ==0 || len > 3)
        {
            return false;
        }

        if(len != 1 && s[0] == '0')
        {
            return false;
        }

        int num = stoi(s);
        if(num>255)
        {
            return false;
        }
        return true;

    }

    void isSubstringValid(string s, int numCnt)
    {
        int len = s.size();
        if(len == 0)
        {
            return;
        }

        if(numCnt == 4)
        {
            if(isValidIpNum(s))
            {
                ipNums.push_back(stoi(s));
                string ip;
                for(int i = 0; i < 4; i++)
                {
                    int num = ipNums[i];
                    ip += to_string (num);
                    if(i != 3)
                    {
                        ip+='.';
                    }
                }
                ret.push_back(ip);
                ipNums.pop_back();
            }
        }
        else
        {
             int loopCnt = min(numLen, len);
             for(int i =0; i < loopCnt; i++)
             {
                string num = s.substr(0,i+1);
                if(isValidIpNum(num))
                {
                    ipNums.push_back(stoi(num));
                    isSubstringValid(s.substr(i+1),numCnt+1);
                    ipNums.pop_back();
                }
             }
        }
        return ;
    }
    vector<string> restoreIpAddresses(string s) {
        
        int len  = s.size();
        if(len <4|| len>12)
        {
            return ret;
        }
        stack<string> stk;
        string ip;
        int numCnt = 1;
        for(int i = 0; i < 3;i++)
        {
            string num = s.substr(0,i+1);
            if(isValidIpNum(num))
            {
                ipNums.push_back(stoi(num));
                isSubstringValid(s.substr(i+1), numCnt+1);
                ipNums.pop_back();
            }
        }
        return ret;
    }
};

 

posted @ 2015-06-26 17:48  linqiaozhou  阅读(257)  评论(0)    收藏  举报