93.leetcode Restore IP Addresses(medium)[回溯 DFS]

来源:互联网 发布:imovie mac 教程 编辑:程序博客网 时间:2024/06/06 10:45

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有4个段,每个段的字符个数可能是1,2,3,因此对每一段循环取1,2,3,然后标记当前是对应的IP段的哪个段,直到IP端已经分为4个段并且取完了string这个时候取到一个合法的ip放入最后的结果中。对每次处理的时候如果按照每次取i个字符处理之后,调用递归取后面的段之后需要把前面的取i得到的字符串去掉,因为如果这里取的满足条件那么后面一定已经存放到结果中。现在需要新起一个开头处理。

class Solution {public:  bool validIP(string digit)    {        int n = digit.size();        if(n>1)        {            if(digit[0] == '0')               return false;        }        const char *chara = digit.c_str();        int num = atoi(chara);        if(num>=0 && num<=255)           return true;        else            return false;    }        void getIP(string &s,int start,int drag,string &mid,vector<string> &result)    {    if(drag == 4)    {            //cout<<mid<<endl;if(start == s.size() && mid != "")            {                 result.push_back(mid.substr(0,mid.size()-1));                 mid = "";            }            return;        }                 for(int k=1;k<=3 && start+k-1<s.size();k++){string temp = s.substr(start,k);            if(validIP(temp))            {            string m = mid;                mid += temp +'.';                getIP(s,start+k,drag+1,mid,result);                mid = m;            }}        return;    }        vector<string> restoreIpAddresses(string s) {        int len = s.size();        vector<string> result;        if(len>12 || len<4) return result;        string mid;        getIP(s,0,0,mid,result);        return result;    }};



0 0
原创粉丝点击