93. 复原 IP 地址

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

可以看出1*n的方格上从下标为0的位置由左向右运动直到下标为n-1的位置,每次只能选择走合法的步数,且必须走4步。

所以,需要使用参数index来记录下标;需要使用参数cnt来记录做的选择的次数。

dfs(index,cnt):index之前的已经考虑完,从index开始考虑,且在下标进行到index之前做了cnt次选择。

index,cnt都传入0。

(1)终止条件:

只有index==n且cnt==4才符合条件。所以在此之前,cnt>4return掉,cnt==4但是index<nreturn掉。index==n但是cnt<4return 掉。

 if (cnt > 4)return;if (cnt==4&&index<n)return;if (index == n&&cnt==4) {res.push_back(path);return;}

(2)做选择

for(int i=index;i<n;i++){if(s[index..i]合法){做选择;dfs(i+1,cnt+1);回溯;}
}

(3)如何判断s[i..j]合法:用一个bool型二维数组预处理是否合法

    for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {//如果只有一个字符if (i == j)check[i][j] = true;//字符个数大于1个else {//如果字符个数大于3个if (j - i + 1 > 3)check[i][j] = false;//如果字符个数在2个或者3个else {//如果第一个字符是0if (s[i] == '0')check[i][j] = false;//第一个字符不是0else {//如果字符个数是2个if (j - i + 1 == 2) {check[i][j] = true;}//如果字符个数是3个else {if ((s[i] - '0') * 100 + (s[j - 1] - '0') * 10 + s[j] - '0' <= 255)check[i][j] = true;else check[i][j] = false;}}}}}}

选择分类讨论的依据并合理运用else来考虑对立条件

(4)点的处理:

当没有做到最后一个选择时,在选择数字后需要加‘.’。

当做到了最后一个选择时,在选择数字后不需要加.。

因为cnt是记录选择的次数,当做最后一次选择的时候,cnt为3。

所以分类讨论的依据是cnt与3。

理解:当cnt等于4时,表示以及做完了4个选择。如果想要在做第4个选择的时候做处理,那么cnt的值为3。因为只有进入到dfs后cnt才会加1,所以在最后一次dfs之前,cnt都是3。

class Solution {
public:vector<string>res;int n;string s;string path;bool check[21][21];void init_check() {for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {//如果只有一个字符if (i == j)check[i][j] = true;//字符个数大于1个else {//如果字符个数大于3个if (j - i + 1 > 3)check[i][j] = false;//如果字符个数在2个或者3个else {//如果第一个字符是0if (s[i] == '0')check[i][j] = false;//第一个字符不是0else {//如果字符个数是2个if (j - i + 1 == 2) {check[i][j] = true;}//如果字符个数是3个else {if ((s[i] - '0') * 100 + (s[j - 1] - '0') * 10 + s[j] - '0' <= 255)check[i][j] = true;else check[i][j] = false;}}}}}}}void dfs(int index, int cnt) {if (cnt > 4)return;if (cnt==4&&index<n)return;if (index == n&&cnt==4) {res.push_back(path);return;}for (int i = index; i < n; i++) {if (check[index][i]) {//注意字符串的拼接操作和取子串操作string temp = s.substr(index, i - index + 1);path += temp;//注意条件:cnt!=3,这个位置的cnt=3是正在做第4次选择的cnt,因为只有在进dfs的时候cnt才会变为4,表示已经做完了4次选择。//但是在第4次做选择的过程中,cnt依旧是3if (cnt!= 3)path += '.';dfs(i + 1, cnt + 1);for (int k = 0; k < temp.size(); k++)path.pop_back();if (cnt != 3)path.pop_back();}}}vector<string> restoreIpAddresses(string s1) {s = s1;n = s.size();init_check();dfs(0, 0);return res;}
};

【深度优先搜索】复原IP地址相关推荐

  1. 93. 复原 IP 地址

    93. 复原 IP 地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔. 例如:"0.1.2.201" ...

  2. [LeetCode] Restore IP Addresses 复原IP地址

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

  3. java实现复原IP地址,回溯算法:复原IP地址

    93.复原IP地址 题目地址:https://leetcode-cn.com/problems/restore-ip-addresses/ 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地 ...

  4. 回溯算法——复原IP地址(Leetcode 93)

    题目选自Leetcode 93.复原IP地址 由于我们需要找出所有可能复原出的 IP 地址,因此可以考虑使用回溯的方法,对所有可能的字符串分隔方式进行搜索,并筛选出满足要求的作为答案. 通俗来讲,就是 ...

  5. 007.复原 IP 地址

    1.题目链接: 93. 复原 IP 地址 2.解题思路: 2.1.题目要求: 给定一串只包含数字的字符串s,返回所有让 s 构成 有效IP地址 的数字组合. 有IP地址: 4个 [0,255] 范围内 ...

  6. [LeetCode] Restore IP Addresses 复原IP地址

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

  7. LeetCode93. 复原IP地址

    93. 复原IP地址 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 输入"010010" 输出["0.10.0.10","0. ...

  8. leetcode系列-93.复原 IP 地址

    leetcode系列–第93题.复原 IP 地址 题目描述:有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔.例如:" ...

  9. LeetCode 第 93 题:复原IP地址(C++)

    93. 复原IP地址 - 力扣(LeetCode) 最开始的思路是对字符串进行三次切割,每次从左边切一块下来(最多切3位数). 那么我们现在有三个切割点(下标) i, j, k,它们应该满足: n=s ...

  10. leetcode:491. 递增子序列、17. 电话号码的字母组合、31. 分割回文串、93. 复原 IP 地址(JavaScript)

    文章目录 491. 递增子序列 分析 去重 如何保证递增呢? 17. 电话号码的字母组合 思路: 单层递归逻辑 递归终止条件 完整代码 另一种写法 31. 分割回文串 思路:分析题目本题可分为两步 9 ...

最新文章

  1. win7安装redis
  2. 逆向工程(Reverse Engineering)
  3. C++ 与 G++的区别
  4. liunx从界面模式改到命令行模式
  5. linux(centos)搭建SVN服务器
  6. 说说 C 语言中的变量与算术表达式
  7. SQL Server 索引和表体系结构(三)
  8. 从Nest到Nesk -- 模块化Node框架的实践
  9. windows server 2003 IIS 调试 ASP时路径问题
  10. arduino 智能车组装步骤_Arduino 智能避障智能小车制作图文教程
  11. 专线多个ip 虚拟服务器,一个云服务器可以做几个ip虚拟机
  12. xenu工具如何扫描网站
  13. c语言实现模糊分类矩阵,模糊聚类分析C程序实现
  14. 今天生日回想这难忘的一年(应届大学生2019-2020一年的总结)
  15. Somatic selection distinguishes oncogenes and tumor suppressor genes
  16. eclipse如何配置工作环境
  17. 武汉新时标文化传媒有限公司短视频创作者实现突围?
  18. 16 16点阵c语言程序,用C语言编程16点阵字库
  19. 音视频学习之时间戳相关整理(时间基tbr,tbn,tbc)
  20. 图像信号处理器及其架构演进

热门文章

  1. qqxml代码-班级作业xml卡片代码班级作业
  2. 手机日志抓取工具及注意事项
  3. 3Dmax哪个版本好用
  4. 小米电视4s android,小米电视系列ROOT教程(含4A,4S,4X等Android6.0.1版机型)
  5. DM_SQL建表语法
  6. mysql数据库默认管理员是_数据库管理员密码的设置
  7. 华为开启管理员模式_华为设备管理员级别与其对应的权限
  8. 基于node搭建前端服务器,nodejs做微信小程序后端
  9. 探索性测试--极限测试法
  10. 怎样查看PPT中的字数