当前位置: 首页 > news >正文

分割回文串 复原IP地址(Java)

分割回文串

关键点:

  1. 递归如何终止:当startIndex == s.length() (注意没有-1是因为这一步操作不会继续进行)
  2. 在递归循环中如何截取子串:关键在于在每个栈都创建属于自己的StringBuffer(!!!很关键,这样就不会在每次换栈的时候手动删除sb),在自己的基础上append即可。
  3. 如何判断回文:类似数组中的左右指针
  4. !!!只有在字符串判断为回文串时才进行递归
/**end其实是不变,虽然每层循环个数不一样,但是每层循环的其实位置也不一样 */
class Solution {List<List<String>> res = new ArrayList<>();List<String> sub = new ArrayList<>();public List<List<String>> partition(String s) {StringBuffer sb = new StringBuffer();fucPartition(s, 0, sb);return res;}public void fucPartition(String s, int startIndex, StringBuffer sb){ //每个里边有自己的sb// 递归终止条件if(startIndex == s.length() ){res.add(new ArrayList<>(sub));return;}for(int i = startIndex; i < s.length(); i++){//截取字串sb.append(s.charAt(i));// 判断是否位回文串if(isTrue(sb)){sub.add(sb.toString()); // 这个别忘了fucPartition(s, i + 1, new StringBuffer()); //创建新的sbsub.remove(sub.size() - 1);//sub.remove(sub.size() - 1); }else{ //如果不是说明分割方式错误continue; // 不再往下进行}}}//判断字符串是不是回文public boolean isTrue(StringBuffer sb){int left = 0;int right = sb.length() - 1;while(left < right){if(sb.charAt(left) == sb.charAt(right)){left++;right--;}else{return false;}}return true;}
}

写博客的目的是每日督促并记录刷题,也欢迎大家批评指正~(day26)(呜呜隔了好多天了,后边要更加油!!)

复原IP地址

我在这里用容器装路径。
思路类似于分割回文串,主要两种不同:

  1. 递归终止条件:够四个数就终止
  2. 判断是否有效性:这里的代码思路是,先保证截取的字符串不能超过3位数,并且如果首位为0说明该字符串只能有一位,如果满足以上条件再将字符串转成int,看是否在0-255范围内。
class Solution {List<String> res = new ArrayList<>();List<Integer> sub = new ArrayList<>();public List<String> restoreIpAddresses(String s) {// 层数的话必须要是四个,并且回溯的本质是枚举if(s.length() < 4 || s.length() > 12){return res; //整体剪枝}fucIp(s, 0, new StringBuffer());return res;}public void fucIp(String s, int startIndex, StringBuffer sb){ //切割字符串,用sb记录自己的情况if(sub.size() == 4){// 正好处理完if(startIndex == s.length()){StringBuffer sbu = new StringBuffer();for(int i : sub){sbu.append(i).append(".");}sbu.deleteCharAt(sbu.length() - 1);res.add(sbu.toString());}return;}for(int i = startIndex; i < s.length(); i++){sb.append(s.charAt(i));if(isTrue(sb.toString())){ // 如果有效就加入进去sub.add(Integer.parseInt(sb.toString()));fucIp(s, i + 1, new StringBuffer());sub.remove(sub.size() - 1);}}}//判断整数是不是有效的public boolean isTrue(String s){//这儿的条件之前考虑不全if(s.charAt(0) == '0' && s.length() > 1){return false;}if(s.length() > 3){return false;}int i = Integer.parseInt(s); // 字符串强转为intif(i < 0 || i > 255){return false;}return true;}
}

http://www.mrgr.cn/news/97545.html

相关文章:

  • 深入理解PCA降维:原理、实现与应用
  • Proteus vs Multisim:电路设计与仿真软件对比
  • Java 三大特性—多态
  • 高德地图 3D 渲染-区域纹理图添加
  • 文献分享: Muvera多向量到单向量的转化方法(Part3——引理证明的补充)
  • 沧州铁狮子
  • ES:geoip_databases
  • 巧用数论与动态规划破解包子凑数问题
  • 计算机面试八股(自整)
  • 无人机装调与测试
  • vue3 脚手架初始化项目生成文件的介绍
  • 七种驱动器综合对比——《器件手册--驱动器》
  • 十四届蓝桥杯Java省赛 B组(持续更新..)
  • babel-runtime 如何缩小打包体积
  • docker的几种网络模式
  • Java反射实战-特殊嵌套格式JSON自定义解析装配
  • 初阶C++笔记第一篇:C++基础语法
  • I²S协议概述与信号线说明
  • 10-MySQL-性能优化思路
  • 网络相关题目