7.6分割回文串(LC131-M)

算法:

有很多分割结果,按照for循环去做肯定做不来

这个时候就要想到回溯!那就要画树!

画树

分割的画树过程其实和组合很像。

例如对于字符串aab:

  • 组合问题:选取一个a之后,在ab中再去选取第二个,选取a之后b中再选取第三个.....。
  • 切割问题:切割一个a之后,在ab中再去切割第二段,切割a之后在b再切割第三段.....。

回溯三部曲:

1.确定返回值和参数

返回值:void

参数:

string s 题目自带的

int startindex 确定每次递归从哪个字符开始切割

2.确定终止条件

切割到字符串最后,就是终止

startindex就是切割线:

startindex >= s.length()

并且要收集结果

3.单层递归逻辑:

子串怎么表示的?

答:[startindex, i]

i是这样定义的:

for (int i = startIndex; i < s.length(); i++)

收集结果:

若子串是回文(要定义一个新的函数,判断子串是否为回文),

将子串add入path,收集

若不是回文,continue,跳出该递归

递归:

注意切割过的位置,不能重复切割,所以,backtracking(s, i + 1); 传入下一层的起始位置为i + 1

backtracking (s, i+1)

回溯:

弹出本次已经添加的子串

path.removeLast()

判断回文子串

最后我们看一下回文子串要如何判断了,判断一个字符串是否是回文。

可以使用双指针法,一个指针从前向后,一个指针从后向前,如果前后指针所指向的元素是相等的,就是回文字符串了。

调试过程:

第一次调试:

class Solution {//全局变量path和resultList<List<String>> result = new LinkedList<>();List<String> path = new LinkedList<>();public List<List<String>> partition(String s) {backtracking (s, 0);return result;}void backtracking (String s, int startindex){//终止条件,收集结果if (startindex >= s.length()){result.add(new LinkedList (path));return;}//单层递归逻辑//判断子串是否为回文if (isplalindrome (s, startindex, i)){//若是,加入pathpath.add (s[startindex, i]);}else {continue;}//递归backtracking (s, i+1);//回溯path.removeLast();}//判断回文plalindrome,左闭右闭boolean isplalindrome (String s, int start, int end){//双指针法for (int i, int j; i <= s.length(), j >=i; i++, j--){if (s[i] == s[j]) return true;return false;}}
}

原因:

1.path.add (s[startindex, i]);` 这一行存在语法错误。想要将子串添加到 `path` 列表中。为了修正这个问题,应该使用 `substring` 方法而不是方括号。修正后的代码应该是:path.add(s.substring(startIndex, i + 1));

在Java中,方括号主要用于数组的索引访问,而不用于提取子串(方括号是适用于python的,java不能用)。

对于字符串提取子串,可以使用`substring`方法,该方法接受起始索引和结束索引作为参数,以提取指定范围内的子串。[左闭右开)

String str = "Hello, World!";  
String sub = str.substring(startIndex, endIndex);  

在这里,`str`是要提取子串的字符串,`startIndex`是子串的起始索引,`endIndex`是子串的结束索引(不包括在内)。提取的子串将包括从`startIndex``endIndex-1`的字符。

因此,在您的代码中,`path.add(s.substring(startIndex, i + 1));`将会提取`s`字符串中从`startIndex``i`(包括`i`)的子串,并将其添加到`path`列表中。

2.`isPalindrome` 方法中的for循环存在几个语法错误。看起来您想要在for循环中声明和初始化多个变量,但是语法是不正确的。让我们进行以下更正:

for (int i = start, j = end; i <= j; i++, j--) {  // ... (代码的其余部分)  
}  

在 Java 中,当在 for 循环中声明多个变量时,不需要在每个变量前都加上 `int`

在 for 循环的初始化部分,只需要在第一个变量声明前加上类型,而后续的变量声明则只需要写变量名和初始值即可。

修改后:

原因:单层递归时忘记加for循环了

第二次调试:

原因:

string不能用方括号

应改为:

s.charAt(i) == s.charAt(j)

第三次调试:

原因:把字符串本身也输出了。

主要问题在判断回文的逻辑上

判断是否为xxx,一定要先判错!有错即错!

当发现不是回文,就要立刻false;有不对的就不往下遍历了。一旦我们找到了一个不同的字符对,我们就可以确定这个字符串不是回文,因此可以立即返回 `false`。这样可以提前结束检查,因为一旦发现不匹配,就不需要继续向后检查。

我原来判断的是,先判断前后是否相等,若相等,则true。

假设字符串是 “abca”。如果我们在检查第一个和最后一个字符相等时就提前返回 `true`那么我们会错误地认为 “abca” 是一个回文字符串,因为我们没有检查中间的字符。而且,当我们找到不同的字符时,就无法及时结束检查,而需要继续检查下去,这会降低算法的效率。

正确代码:

class Solution {//全局变量path和resultList<List<String>> result = new LinkedList<>();List<String> path = new LinkedList<>();public List<List<String>> partition(String s) {backtracking (s, 0);return result;}void backtracking (String s, int startindex){//终止条件,收集结果if (startindex >= s.length()){result.add(new LinkedList (path));return;}//单层递归逻辑//判断子串是否为回文for (int i=startindex; i<s.length();i++){ if (isplalindrome (s, startindex, i)){//若是,加入pathpath.add(s.substring(startindex, i+1));}else {continue;}//递归backtracking (s, i+1);//回溯path.removeLast();}}//判断回文plalindrome,左闭右闭boolean isplalindrome (String s, int start, int end){//双指针法for (int i=start, j=end; j >=i; i++, j--){if (s.charAt(i) != s.charAt(j)) return false;   }return true;}
}

时间空间复杂度:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2661491.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA 2022.2 安装教程

1.下载2020.3版本IDEA 链接&#xff1a;https://pan.baidu.com/s/1IFK8VRjT7vM2VM75ToveGQ?pwd176m 提取码&#xff1a;176m 2.安装 下载完成后&#xff0c;双击exe安装包&#xff0c;出现IDEA安装欢迎首页&#xff1a; 3.将 ja - netfiltet 文件复制到idea安装目录附件 …

docker学习笔记04-可视化界面Portainer

1.Portainer简介 Portainer 是一款开源的容器管理工具&#xff0c;旨在帮助用户更轻松地管理 Docker 环境。无论您是 Docker 新手还是经验丰富的开发人员&#xff0c;Portainer 都提供了直观的用户界面&#xff0c;使您能够方便地创建、部署和监控容器。 安装 Portainer 非常…

Docker本地部署开源浏览器Firefox并远程访问进行测试

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

Windows不同的域名由不同的DNS服务器解析

gpedit.msc(组策略)-计算机配置-Windows设置-域名解析策略 本次改动在注册表中体现的位置。 计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Dnscache\Parameters\DnsPolicyConfig\{666881c9-5525-434b-a62a-2ed5c61d53e5} 计算机\HKEY_LOCAL_MACHINE\SYSTEM\Cur…

FileZilla的使用主动模式与被动模式

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、FileZilla简介 1、FileZilla是什么&#xff1f; 2、FileZilla的应用场景 二、FileZilla的安装 1、下…

YoloV8改进策略:基于自研的图注意力机制改进| 独家改进方法|图卷积和注意力融合模块

摘要 SE注意力机制是一种通过显式建模卷积特征的信道之间相互依赖性的方法,旨在提高网络产生的表示的质量。SE注意力机制包括两个步骤:Squeeze和Excitation。在Squeeze步骤中,通过全局平均池化操作将输入特征图压缩成一个向量,然后通过一个全连接层将其映射到一个较小的向…

设计模式(4)--对象行为(8)--状态

1. 意图 允许一个对象在其内部状态改变时改变它的行为。 2. 三种角色 上下文环境(Context)、抽象状态(State)、具体状态(Concrete State) 3. 优点 3.1 将与特定状态相关的行为局部化&#xff0c;并且将不同状态的行为分割开来。 3.2 使得状态转换显式化。 3.3 State对象可被共…

060:vue中markdown编辑器mavon-editor的应用示例

第060个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

别再盲目运营私域电商小程序了!这五大实操策略让你轻松实现盈利!

私域电商的崛起&#xff0c;已经成为了电商行业的新潮流。在这个趋势中&#xff0c;私域电商小程序以其独特的优势&#xff0c;成为了实现从运营到盈利的关键环节。那么&#xff0c;如何利用私域电商小程序快速达到盈利目标呢&#xff1f;接下来&#xff0c;我们将为您揭秘私域…

天津医科大学临床医学院专升本药学专业有机化学考试大纲

天津医科大学临床医学院高职升本科专业课考试大纲药学专业《有机化学》科目考试大纲 一、考试基本要求 本考试大纲主要要求考生对《有机化学》基本概念有较深入的了解&#xff0c;能够系统地掌握各类化合物的命名、结构特点及立体异构、主要性质、反应、来源和合成制备方法等…

3D游戏角色建模纹理贴图处理

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在本文中&#xff0c;我们将介绍 3D 纹理的基础知识&#xff0c;并讨…

【新版Hi3559AV100 旗舰8K30 AI摄像机芯片】

新版Hi3559AV100 旗舰8K30 AI摄像机芯片 一、总体介绍 Hi3559AV100是专业的8K Ultra-HD Camera SOC&#xff0c;它提供了8K30/4K120广播级图像质量的数字视频录制&#xff0c;支持8路Sensor输入&#xff0c;支持H.265编码输出或影视级的RAW数据输出&#xff0c;并集成高性能ISP…

常用环境部署(十)——MySQL主从同步数据搭建(一主一从)

一、主从服务器MySQL安装 1、注意事项 主从服务器数据库尽量安装同一版本&#xff0c;避免兼容性造成的一些错误产生 2、Centos安装MySQL 链接&#xff1a;centos7离线安装MySQL-CSDN博客 二、主库MySQL配置 1、修改主库配置 &#xff08;1&#xff09;编辑数据库配置文…

ClickHouse基础知识(四):ClickHouse 引擎详解

1. 表引擎的使用 表引擎是 ClickHouse 的一大特色。可以说&#xff0c; 表引擎决定了如何存储表的数据。包括&#xff1a; ➢ 数据的存储方式和位置&#xff0c;写到哪里以及从哪里读取数据。 默认存放在/var/lib/clickhouse/data ➢ 支持哪些查询以及如何支持。 ➢ 并发数…

缓冲流得到

原始的字节流转移文件&#xff0c; 缓冲流到字节数组的数据交换&#xff0c;因为是在内存里面运行&#xff0c;所以速度很快 扩大缓冲池内存 字符缓冲流 这个方法readLine用的挺多的

Windows环境检验NodeJs安装是否成功

Windows环境检验NodeJs安装是否成功 检验方法 1、winR 打开运行窗口&#xff0c;在此窗口输入cmd命令 2、进入命令提示符窗口&#xff0c;分别输入以下命令&#xff0c;显示版本号&#xff0c;则安装成功 node -v&#xff1a;显示安装的nodejs版本npm -v&#xff1a;显示安装…

文件销毁 硬盘销毁 数据销毁:护航数据安全的最后一公里

希望与业界各位志同道合的伙伴交流切磋最新的网络、服务器行业动态信息&#xff0c;同时分享腾讯在网络与服务器领域&#xff0c;规划、运营、研发、服务等层面的实战干货&#xff0c;期待与您的共同成长。 网络平台部以构建敏捷、弹性、低成本的业界领先海量互联网云计算服务…

判断字符串回文----每日一题

大家好我是Beilef&#xff0c;今天分享的是字符串回文。魂影大家在评论区留言。O(∩_∩)O 文章目录 目录 文章目录 题目重现&#xff1a; 题⽬描述&#xff1a; 输⼊⼀个字符串&#xff0c;判断这个字符串是否是回⽂字符串&#xff08;字符串的⻓度⼩于等于30&#xff0c;字符…

DAY3C++

定义一个Person类&#xff0c;包含私有成员&#xff0c;int *age&#xff0c;string &name&#xff0c;一个Stu类&#xff0c;包含私有成员double *score&#xff0c;Person p1&#xff0c;写出Person类和Stu类的特殊成员函数&#xff0c;并写一个Stu的show函数&#xff0c…

GitHub Copilot 终极详细介绍

编写代码通常是一项乏味且耗时的任务。现代开发人员一直在寻找新的方法来提高编程的生产力、准确性和效率。 像 GitHub Copilot 这样的自动代码生成工具可以使这成为可能。 GitHub Copilot 到底是什么&#xff1f; GitHub Copilot 于 2021 年 10 月推出&#xff0c;是 GitHub 的…