当前位置: 首页 > 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()); //创建新的sb
                sub.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); // 字符串强转为int
        if(i < 0 || i > 255){
            return false;
        }
        return true;
    }
}

相关文章:

  • 光场调制技术在超快激光加工中的应用
  • (高频SQL50题)1667. 修复表中的名字
  • springboot+vue2集成JWT token实现权限验证
  • 如何更好的理解 beforeEach 全局前置守卫,在处理路由跳转前触发,怎么实现常用的全局权限校验、登录状态检查的呢?
  • 深入解析SQL多表查询:核心技巧与实战示例
  • 【前端进阶】可选链与空值合并:接口数据容错处理的最佳实践
  • G-升!龙!_牛客周赛 Round 88
  • 深入源码级别看spring bean创建过程
  • Go语言类型捕获及内存大小判断
  • JVM核心机制:类加载×字节码引擎×垃圾回收机制
  • 硬盘分区格式方案之 MBR(Master Boot Record)主引导记录详解 笔记250407
  • 七彩虹隐星G15笔记本信息
  • 优化 Django 数据库查询
  • 数据库——Mysql
  • Vue学习笔记 - 安装与环境搭建
  • AI浪潮下的IT职业转型:医药流通行业传统IT顾问的深度思考
  • Java面试黄金宝典40
  • 小甲鱼python【p3】
  • Vue.js 实现下载模板和导入模板、数据比对功能核心实现。
  • Scala-面向对象2和集合
  • 日本一季度实际GDP环比下降0.2%
  • 申论|空间更新结合“青银共生”,助力青年发展型城区建设
  • 商务部:中方敦促美方尽快停止232关税措施
  • 普京确定俄乌谈判俄方代表团名单
  • 国台办:台湾自古属于中国,历史经纬清晰,法理事实清楚
  • 横跨万里穿越百年,《受到召唤·敦煌》中张艺兴一人分饰两角