zoukankan      html  css  js  c++  java
  • [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);
  • 相关阅读:
    670. Maximum Swap
    653. Two Sum IV
    639. Decode Ways II
    636. Exclusive Time of Functions
    621. Task Scheduler
    572. Subtree of Another Tree
    554. Brick Wall
    543. Diameter of Binary Tree
    535. Encode and Decode TinyURL
    博客园自定义背景图片
  • 原文地址:https://www.cnblogs.com/love-yh/p/7207368.html
Copyright © 2011-2022 走看看