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

leetcode131-分割回文串

leetcode 131
在这里插入图片描述

思路

本题也是使用回溯来解答,不懂回溯的可以看看之前博文:组合
其实对于回溯的问题有一个模版,我们一般设计到回溯就有递归,需要写一个递归函数,递归函数需要判断什么时候是终止条件,在回溯中,一般使用递归函数不会有返回值,所以我们在外层写上全局变量result存放所欲需要的结果值,path作为每一层遍历的结果值。

对字符串进行切割的时候是不是需要知道从哪个位置开始切割呢?

是的,所以我们的startIndex作为切割的起始位置,每次遍历的时候从startIndex开始,一直到str.length的位置,当startIndex === str.length的时候,说明字符串都遍历完了,后面也没有值可以遍历了,这时候递归就要结束,然后我们需要把path放到结果集result中,⚠️:存放path的时候不能直接存放,因为path是数组,直接存放的话会存放引用地址,后续path的改变也会影响result,所以此处需要copy一份path的内容来存放。
但是大家会疑惑,直接push了path的值,没有判断是否是回文串呢?这里把逻辑判断放在了path入栈的时候,在入栈的时候会判断这个值是否是回文串,只有满足回文串才能进入path中,如果不是回文串就continue,注意这里是continue,不是return!!!

为什么不是回文串的时候是continue而不是return呢?

这里我们举个例子,s = ‘aaba’
假设第一次分割点在第一个a后,分割后的结果:a/aba,后续要对aba进行分割,有三种情况:

  • [a]/ba
  • [ab]/a
  • [aba]/
    我们要判断的是否回文串是对括号中的元素来判断,当遇到ab不是回文串的时候如果return,那么就不会再分割到下一个值aba/了,如果是continue就会跳过ab这个分割值,继续后续的分割点
    对于aaba这个子串,我们的分割情况可以是这样的:
    在这里插入图片描述

解答

var partition = function (s) {
  let result = [], path = [];
  const backtracking = (str, startIndex) => {
    if (startIndex === str.length) {
      result.push([...path])
      return;
    }
    for (let i = startIndex; i < str.length; i++) {
      if (isPalindromeStr(str, startIndex, i)) {
        // 是回文子串
        path.push(str.slice(startIndex, i + 1))
      } else {
        continue;
      }
      backtracking(str, i + 1)
      // 回溯
      path.pop()
    }
  }
  backtracking(s, 0)
  return result;
};
// 判断是否回文串
const isPalindromeStr = (str, startIndex, i) => {
  while (startIndex < i) {
    if (str[startIndex] !== str[i]) return false
    startIndex++
    i--
  }
  return true
}
http://www.dtcms.com/a/95982.html

相关文章:

  • [leetcode]1749. 任意子数组和的绝对值的最大值(dp)
  • 代理模式(Proxy Pattern)实现与对比
  • 珠心算之学习周期
  • 图片解释git的底层工作原理
  • Redis的Set集合
  • Reactor 事件流 vs. Spring 事件 (ApplicationEvent)
  • [cpp] cpp11--condition_variable(条件变量)
  • 【ESP32】VSCode配置ESP-IDF问题及解决方法
  • Promise的状态和方法是什么?
  • OpenHarmony子系统开发 - init启动引导组件(八)
  • 【AI编程学习之Python】第一天:Python的介绍
  • Python_电商erp自动拆分组合编码
  • Kafka中的消息是如何存储的?
  • 软件工程面试题(九)
  • CXL UIO Direct P2P学习
  • Python 服务器部署全解析:API 调用、数据处理与展示
  • 头歌 | Linux之用户高级管理
  • MYTOOL-笔记
  • Linux系统编程 | 线程的基本概念
  • 安装Webpack并创建vue项目
  • 深入理解 `git pull --rebase` 与 `--allow-unrelated-histories`:区别、原理与实战指南
  • 中医卫气营血辨证
  • STM32基础教程——旋转编码器测速
  • Django实战:打造美观的管理后台
  • 【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程
  • Python np.vectorize函数介绍
  • 【万字总结】前端全方位性能优化指南(七)——按需加载、虚拟列表、状态管理
  • 微软重磅发布 OmniParser V2.0:AI 视觉解析能力跃升,开启界面自动化新时代
  • FPGA——分秒计数器设计(DE2-115开发板)
  • SpringBoot工程如何考虑优化使其视频请求更流畅