首页 > 代码库 > [Leetcode] restore ip address 存储IP地址
[Leetcode] restore ip address 存储IP地址
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地址的形式存储。
思路:首先要明白IP地址的书写形式。IP地址由32位二进制数组成,常以XXX.XXX.XXX.XXX形式表现,每组XXX代表小于或等于255的10进制数,故IP地址总共有四段,每一段可能有一到三位,范围是[0, 255],题目明确指出输入字符串只含有数字。
两点要注意:一、当某段是三位时,我们要判断其是否越界(>255);二、当只有一位时,0可以成某一段,如果有两位或三位时,像 00, 01, 001, 011, 000等都是不合法的。
可以看做是字符串的分段问题,在输入字符串中加入三个点,将字符串分为四段,每一段都要是合法的(条件见上面两点)。使用递归法,我们用k来表示当前还需要分的段数,终止条件是当如果k = 0(则表示三个点已经加入完成,四段已经形成),若这时字符串刚好为空即s.empty(),这种个字符串是合法的。若k != 0, 则对于每一段,我们分别用一位,两位,三位来尝试,分别判断其合不合法,如果合法,则调用递归继续分剩下的字符串,最终和求出所有合法组合。
参考了Grandyang的博客。代码如下:
1 class Solution { 2 public: 3 vector<string> restoreIpAddresses(string s) 4 { 5 vector<string> res; 6 restore(s,res,4,""); 7 return res; 8 } 9 10 void restore(string s,vector<string> &res,int k,string str) 11 { 12 if(k==0&&s.empty()) 13 res.push_back(str); 14 else 15 { 16 for(int i=1;i<4;++i) 17 { 18 if(s.size()>=i&&isValid(s.substr(0,i))) 19 { 20 if(k==1) 21 restore(s.substr(i),res,k-1,str+s.substr(0,i)); 22 else 23 restore(s.substr(i),res,k-1,str+s.substr(0,i)+"."); 24 } 25 } 26 } 27 } 28 29 bool isValid(string s) 30 { 31 if(s.size()>3||s.empty()||(s.size()>1&&s[0]==‘0‘)) 32 return false; 33 int val=atoi(s.c_str()); 34 return val>=0&&val<=255; 35 } 36 };
可以将第20~23行简写为如下:
1 restore(s.substr(i),k-1,str+s.substr(0,i)+(k==1?"":"."),res);
[Leetcode] restore ip address 存储IP地址