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

代码随想录刷题day50|(回溯算法篇)131.分割回文串▲

目录

一、回溯算法基础知识

二、分割回文串思路

2.1 如何切割

2.2 判断回文

2.3 回溯三部曲 

2.4 其他问题

三、相关算法题目

四、总结


一、回溯算法基础知识

详见:代码随想录刷题day46|(回溯算法篇)77.组合-CSDN博客

二、分割回文串思路

回溯递归法

两个问题:1.如何切割?2.判断回文?

2.1 如何切割

切割问题可以抽象成组合问题:取自代码随想录

如何模拟切割线

切割线通过startIndex和 i 来模拟,表示当前处理的子串范围;

2.2 判断回文

利用双指针法,一个从前往后遍历字符串s,另一个从后往前遍历字符串s,当两者不等时,不是回文,返回false;否则返回true;

2.3 回溯三部曲 

①函数参数和返回值:返回为空void,参数传入字符串s,以及每次递归遍历时的起始位置startIndex;

②终止条件:递归的深度,树的深度,何时结束递归:当切割到字符串的最后位置(s.length的位置)时,说明本次递归结束,将本次结果加入result结果集中,然后返回;

③单层递归逻辑:for循环中,startIndex 表示每次递归中开始遍历的起始位置,i 从startIndex开始,逐渐+1,那么[startIndex, i] 就是要截取的子串;得到子串以后,首先判断是否为回文,如果是,加入单个结果集 list 中,然后回退;如果不是,跳过本次循环,i++;

注意切割过的位置不能重复切割,所以递归中startIndex参数要传入 i+1;

2.4 其他问题

递归循环中如何截取子串?

通过String的substring方法👇

public String substring(int beginIndex, int endIndex)

返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex

参数:beginIndex - 起始索引(包括);endIndex - 结束索引(不包括)。

示例:

"hamburger".substring(4, 8)   returns "urge"

"smiles".substring(1, 5)          returns "mile"

三、相关算法题目

131.分割回文串

class Solution {
    List<String> list = new ArrayList<>();//存放单个结果
    List<List<String>> result = new ArrayList<>();//存放结果集合
    public List<List<String>> partition(String s) {
        backtracking(s,0);
        return result;
    }
    private void backtracking(String s, int startIndex){
        //如果起始索引已经超过子串长度 说明分割完毕 得到结果
        if(startIndex >= s.length()){
            result.add(new ArrayList<>(list));
            return;
        }
        //单层递归逻辑
        for(int i = startIndex;i < s.length();i++){
            //提取从startIndex 到 i 的子串
            String substring = s.substring(startIndex, i + 1);
            //判断是否为回文
            if(isPalindrome(substring)){
                //是回文
                list.add(substring);
                backtracking(s, i+1);//递归处理剩余部分
                list.removeLast();//回溯 移除当前子串
            }
        }

    }
    //判断一个字符串是否是回文
    private boolean isPalindrome(String s){
        int left = 0;
        int right = s.length() - 1;
        while(left < right){
            if(s.charAt(left) != s.charAt(right)){
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

四、总结

1.本题难点:理解分割回文串 类似 组合问题,也可以抽象成树的结构,深度代表递归的深度,宽度代表for循环;

2.切割的方式,也就是具体的树结构是什么样的?每一个节点;

3.终止条件,最后的叶子节点;

4.单层递归逻辑,每次截取的子串是哪里到哪里?

5.如何判断一个字符串是否为回文;

6.如何截取子串;

7.这真的是中等题目吗,自己想从一开始分割方式抽象成树结构就错咯😶

相关文章:

  • zephyr-中国跨国并购数据(1997-2024.3.8)
  • C# System.Text.Encoding 使用详解
  • 支持向量机(SVM):从入门到精通的机器学习利器
  • 多模态大模型常见问题
  • 模型整合-cherry studio+mysql_mcp_server服务配置
  • Flink实战教程从入门到精通(基础篇)(一)Flink简介
  • 从PGC到AIGC:海螺AI多模态内容生成系统架构一站式剖析
  • VS010生成可由MATLAB2016调用的DLL文件方法
  • 实现MySQL的横向扩展
  • kubernetes pod控制器 DaemonSet
  • 第P8周:YOLOv5-C3模块实现
  • 【漫话机器学习系列】152.ReLU激活函数(ReLU Activation Function)
  • ARM 汇编基础
  • FPGA中串行执行方式之状态机
  • AWS CDK实战:用代码重新定义云基础设施部署
  • 基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例
  • xcode中移除安装的package dependency
  • Spring 事务传播方式
  • 解决Popwindow宽高的问题。
  • 大模型sft-数据构建和选择
  • 职业生涯规划大赛活动目的/游戏优化大师官方下载
  • 网站租用服务器多少钱/网站推广排名收费
  • 做youtube视频网站/苏州seo关键词排名
  • 怎样创建网站和网页/中国网站排名100
  • 商城网站的建设费用/小学生摘抄新闻
  • 大凤号 网站建设/网站推广优化排名教程