Leetcode: restore ipAddress 恢复ip地址,找出所有可能性

来源:互联网 发布:卡密软件下载 编辑:程序博客网 时间:2024/06/06 03:01

给出一个只包含数字的字符串,找出它所有可能的合法的IP地址。

比如给出 "25525511135",

那么就返回 ["255.255.11.135","255.255.111.35"]


解题的思路考虑的是backtrack回溯法,首先要有一个valid函数判断当前纳入的字符串是否符合ip的规范0-255之间,如果符合,继续寻找下一个,如果不符合的话,就需要返回到上一次的结果,再尝试另外的可能性。


vector<string> restoreIpAddresses(string s) {        vector<string> result;        int len = s.length();        if(index >= len)        return;        if(len > 12 || len < 4) return result;        string tmp = "";        // start from the first one        int num = 1;        restore(s,0,num,result,tmp);           }    void restore(string s, int index, int num, vector<string>& result,string tmp)    {        int len = s.length();        if(num >= 4)        {            if(len - index  <= 3 && len - index > 0)               {                    int k = len - index;                    if(valid(s.substr(index,k)))                    {                         tmp += s.substr(index,k);                         result.push_back(tmp);                    }               }            else return;        }        else{            tmp += s.substr(index,1);//单个数字的情况            tmp += '.';            restore(s,index+1,num+1,result,tmp);            tmp = tmp.substr(0,tmp.length()-2);            if(s[index] != '0'){//两个数字                tmp += s.substr(index,2);                tmp += '.';                restore(s,index+2,num+1,result,tmp);            }            tmp = tmp.substr(0,tmp.length()-3);                       string tmp1 = s.substr(index,3);//三个数字               if(tmp1.length() == 3 && valid(tmp1))            {                tmp += s.substr(index,3);                tmp += '.';                restore(s,index+3,num+1,result,tmp);                    tmp = tmp.substr(0,tmp.length()-4);            }        }    }    bool valid(string s)    {          if(s.length() == 2)          {               if(s[0] == '0')                    return false;               else return true;          }          if(s.length() == 1)               return true;          int num = 0;          for(int i = 0 ; i < 3; i++)               num += (s[i] - '0')*pow(10,2-i);          if(num <= 255 && num >= 100)               return true;          return false;    }


原创粉丝点击