首页 > 代码库 > [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地址