题目:Restore IP Address

  • English:

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

Example:

Input: “25525511135”
Output: [“255.255.11.135”, “255.255.111.35”]

  • 中文:

给定一个只包含数字的字符串,通过返回所有可能的有效IP地址组合来还原它。
样例:

输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]


  • 分析思路:
    有效(合法)IP地址

合法的IP地址中,每个三位数都是在0~254之间的,不可能是大于254就连255都不行。这才是合法的IP地址,还有 IP地址有A\B\C类IP。

iPv4的ip地址都是(1~ 255).(0~ 255).(0~ 255).(0~255)的格式。

A类的IP地址范围为0.0.0.0-127.255.255.255,B类的IP地址范围为128.0.0.0-191.255.255.255,C类的IP地址范围为192.0.0.0-223.255.255.255。

而在A类IP地址里,其中网络的标识长度为8位,主机标识的长度为24位,子网掩码为255.0.0.0。B类适合用于中等规模的网络。

其中网络的标识长度为16位,主机标识的长度为16位,子网掩码为255.255.0.0。C类适合小规模的局域网,其中网络的标识长度为24位,主机标识的长度为8位,子网掩码为255.255.255.0。

而且在每个合法的IP地址中,有4个3位数用“.”隔开的数字,而且每个三位数都在0到255之间,并且包含255这个数字。

题目明确指出输入字符串只含有数字,所以当某段是三位时,我们要判断其是否越界(>255),还有一点很重要的是,当只有一位时,0可以成某一段,如果有两位或三位时,像 00, 01, 001, 011, 000等都是不合法的,所以我们还是需要有一个判定函数来判断某个字符串是否合法。这道题其实也可以看做是字符串的分段问题,在输入字符串中加入三个点,将字符串分为四段,每一段必须合法,求所有可能的情况。

采用枚举法,从前往后一个数一个数枚举,目标枚举四个数,若当前枚举到最后一位。

恰好有4个数,说明这个方案成立合法

大于4个数,提前返回
若当前这一位为0,要使其合法,则只能单独作为一个数存在
当前这一位不为0,则它可以和后面的数,组合起来形成合法的IP地址,枚举当前这一位和后面的几位拼在一起,小于256是合法的

更新状态

  • 代码:

class Solution{public://string to_string (int val);vector<string>ans;vector<string> RestoreIPAddress(string s){string path;dfs(s,0,0,path); //s:字符串;0:当前枚举到哪一位;0:当前所找的方案数;path:方案数return ans; }void dfs(string &s,int m,int n,string path){if(m==s.size()) //出口条件,当前枚举到字符串的最后一位 {if(n==4) //枚举到最后一位且数的个数恰好为4 {ans.path_back(path.substring(1)) //合法方案;substring返回从第一个开始之后的字符串 }return; }if(n>4) return;//下一个数的选法if(s[m]=='0') //当前这一位为0单独的数,是以0开头的IP是非法的 dfs(s,m+1,n+1,path+".0"); //从下一位开始枚举 else{//从当前这一位m开始选, for(int i=m,t=0;i<s.size();i++){//更新,t:存储当前所枚举的数 //假设t=23,若下一位为1,t=23*10+1 t=t*10+s[i]-'0'; //s[i]ASCll转数字减0 if(t<256)dfs(s,i+1,n+1,path+'.'+to_string(t));else break;}}}
};

Restore IP Address-深度优先遍历DFS相关推荐

  1. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  2. Java实现深度优先遍历-DFS

    Java实现深度优先遍历-DFS 实现功能:使用深度优先遍历算法DFS计算地铁指定起点站和终点站之间的所有路径 1.构造地铁站点数据结构 地铁站点数据结构包含2个属性,1个站点名,1个邻接站点列表 i ...

  3. 图的深度优先遍历DFS(JAVA)

    图的深度优先遍历算法 在此介绍图的基本算法之一的深度优先遍历(DFS)算法 广度优先搜索(BFS). 什么是DFS 图是由节点(Node)和路径(Route)组成的一种数据结构,用于反应各节点间的关系 ...

  4. 华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏.玩家需要根据9X9盘面上 ...

  5. 图——深度优先遍历(DFS)实现有向无环图的逆拓扑排序

    对图的深度遍历与对树的深度遍历思想类似,采用的是递归函数的办法. 如果是非连通图,则DFS遍历所有顶点即可. //Graph 图 //vertex 顶点,用一个int型变量表示//返回有向图G中顶点v ...

  6. 图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现

    遍历的定义: 从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算. 一:深度优先遍历(DFS) 1,在访问图中某一起始顶点V后,由V ...

  7. Java数据结构之图的基本概念和算法,深度优先遍历DFS,广度优先遍历BFS(图解)

    文章目录 前言 一.图的基本概念 1.图的定义 2.基本术语 二.图的基本算法 1.初始化图 2.插入顶点和边 3.矩阵打印 4.返回第一个邻接结点的下标 5.返回第一个邻接结点的下一个结点的下标 三 ...

  8. Unique Binary Search Trees ll -深度优先遍历DFS

    题目:Unique Binary Search Trees ll English: Given an integer n, generate all structurally unique BST's ...

  9. 数据结构-图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

    https://www.cnblogs.com/qzhc/p/10291430.html 最后一个广度优先有错误,H不指向E,只有G指向E,所以顺序应该是ABCFDHGE

  10. 九键字母组合-深度优先遍历DFS

    题目:九键字母组合 在手机九键里按下某几个数字会得到哪些字母组合? 例如,按下"23"的可能字母组合有9种 : ad ae af bd be bf cd ce cf 请按字典序输出 ...

最新文章

  1. pandas使用date_range函数按照指定的频率(freq)和指定的个数(periods)生成dataframe的时间格式数据列、基于dataframe的日期数据列生成日期索引
  2. DataGridView中实现点击单元格Cell动态添加自定义控件
  3. 【NLP实战】Task1 数据集探索
  4. C++学习-环境配置
  5. LeetCode177 第N高的薪水
  6. java中日期与字符串之间的转换
  7. Python+Selenium学习笔记8 - 多表单多窗口切换
  8. 爱因斯坦:量子物理与抽象数学(广义)
  9. Asp.net中Application Session Cookie ViewState Cache
  10. python自学行吗-没有编程基础,可以自学Python吗?
  11. CSS的inherit与auto使用分析
  12. NLPIR java测试(没找到范例代码)
  13. 计算机应用基础教材提纲,《计算机应用基础》课程教学大纲
  14. 龙之谷私服源码+搭建教程
  15. 图解大数据 | 大数据分析挖掘-Spark初步
  16. c语言大于一小于10,C语言首先输入一个大于2且小于10的整数
  17. VUE项目初始化报[404 Not Found - GET https://r.cnpmjs.org/xxxx]
  18. java 设计模式之: 建造模式(Builder)
  19. 大牛给计算机方向学生的 7 个建议
  20. Windows间歇性高ping(高延迟)解决办法

热门文章

  1. python使用-Python3 错误和异常
  2. python从入门到精通需要多久-Python从入门到精通只需要一个月就够了!
  3. python是什么软件-学习python用什么软件
  4. python语言-python语言的有何特点?
  5. 现在有什么开源的语音识别吗?
  6. 利用MATLAB平台实现字的语音识别功能
  7. 收文处理和发文处理的环节_液相色谱使用中样品预处理需要注意的几个环节汇总!...
  8. linux 桥接stp原理,Linux操作系统网桥源码框架初步分析
  9. 结构体中操作c语言,C语言中结构体的操作
  10. arcgis加载天地图_【arcgis地图实战】之天地图在线服务加载