热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【LeetCode】Day48复原IP地址

题目93.复原IP地址【中等】题解又是回溯法…下面这句话很重要:回溯算法事实上就是在一个树形问题上做深度优先遍历,因此首先需要把问题转换为树形问题

题目

93. 复原 IP 地址【中等】


题解

又是回溯法…


下面这句话很重要:
 
回溯算法事实上就是在一个树形问题上做深度优先遍历,因此 首先需要把问题转换为树形问题


这题主要利用 indexindexindexstartstartstart 两个变量控制DFS


  • index为IP地址处理到第几个段了,每次+1
  • start是原始字符串中遍历到第几个字符

class Solution {static final int SEG_NUM&#61;4;//IP地址四个段List<String>res&#61;new ArrayList<>();//结果集int[] segment&#61;new int[SEG_NUM];//IP地址,四个整数public List<String> restoreIpAddresses(String s) {int n&#61;s.length();if(n<4||n>12)return res;dfs(s,0,0);return res;}public void dfs(String s,int index,int start){int n&#61;s.length();//地址四个空都满了if(index&#61;&#61;SEG_NUM){//s遍历完了,得到新的有效地址,加入结果集if(start&#61;&#61;n){StringBuilder str&#61;new StringBuilder();for(int i&#61;0;i<SEG_NUM;i&#43;&#43;){str.append(segment[i]);if(i!&#61;SEG_NUM-1)str.append(&#39;.&#39;);}res.add(str.toString());}return;}//IP地址四个段还没满else{//s遍历到末尾了,说明不能成为有效地址,回溯if(start&#61;&#61;n){return;}//处理前导0if(s.charAt(start)&#61;&#61;&#39;0&#39;){segment[index]&#61;0;dfs(s,index&#43;1,start&#43;1);}//一般情况int addr&#61;0;for(int i&#61;start;i<n;i&#43;&#43;){addr&#61;addr*10&#43;(s.charAt(i)-&#39;0&#39;);//字符转整数if(addr>0&&addr<&#61;255){segment[index]&#61;addr;dfs(s,index&#43;1,i&#43;1);//确定了一个段,继续搜索下一个段}elsereturn;}}}
}

在这里插入图片描述

P.S. StringBuilder效率是java字符串中最高的&#xff0c;它的append函数有N多重载形式&#xff0c;因此可以直接添加int型变量&#xff1a;
在这里插入图片描述


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
author-avatar
1614221827wwz
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有