leetcode Restore IP Addresses

             好久没有更新了。最近在看stl源码解析。所以没有太做题了。顺便说下这本书,乍一看感觉很难,仔细看几天收获还是不错。只能感叹c++泛型机制好流弊。。。leetcode上面也就做了50个。

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)

题意很简单就是找出所有能表示ip地址的串。这题太明显是个深搜了。只不过有几个细节需要处理。比如025不能出现在一个字节上。(25才可以)

深搜结束是到达字符串结束并且能够组成4个字节的ip地址。th为当前字节,k是搜索的位置。这里深搜的几个条件说一下,当前字节满足大于2位是0位置上不能是0,而且数字要在0和255之间。然后就可以一直搜下去了。当然还要注意下恢复字符串。

vector<string> ss;
int fun(string s)
{
    int n=s.size();
    int sum=0;
    int i=0;
    while(i<n)
    {
        sum=sum*10+s[i]-'0';
        i++;
    }
    return sum;
}

void dfs(string s ,int k,int th,int n,string res)
{
    if(th>4 && k==n)
    {   ss.push_back(res);
        return ;
    }
    if(th>4 && k<=n-1)
        return ;
    for(int i=0;i<3 && k+i<=n-1;i++)
    {
        string t(s.begin()+k,s.begin()+k+i+1);
        if(t[0]=='0'&&t.size()>1)
            continue;
        if(fun(t)>=0 &&fun(t)<=255)
        {
            int c=res.size();
            res+=t;
            if(th!=4)
                res.push_back('.');
            dfs(s,k+i+1,th+1,n,res);
            res.resize(c);
        }
    }
}
vector<string> restoreIpAddresses(string s) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
    ss.clear();
    int n=s.size();
    dfs(s,0,1,n,"");
    return ss;
}


如果大家发现不对的地方请指正谢谢。

最后希望赶紧发自己的小论文,好蛋疼。。



你可能感兴趣的:(LeetCode,搜索,DFS)