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);
  • 相关阅读:
    分布式系统的架构思路
    可汗学院超经典、超实用概率论总结——商女不知忘国恨,隔江犹看概率论
    傅里叶分析之掐死教程(完整版)
    谈谈敏捷开发
    C# 读xml注释或过滤xml注释
    CTF中那些脑洞大开的编码和加密
    C#关闭一个窗口的同时打开另一个窗口
    继《关于讯飞语音SDK开发学习》之打包过程中遇到小问题
    使用ffmpeg录音
    leetcode 1. Two Sum
  • 原文地址:https://www.cnblogs.com/love-yh/p/7207368.html
Copyright © 2011-2022 走看看