JS算法-分割回文串

简介: JS算法-分割回文串

题目


给你一个字符串 s,请你将 **s **分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

输入: s = "aab"
输出: [["a","a","b"],["aa","b"]]


题解


我们这里声明两个函数,分别是isPalindromepartition函数。 isPalindrome 的功能是判断一个字符串是否是回文的。该函数首先将传入的字符串 s 分割成单个字符的数组 token,然后利用双指针方法,分别指向第一个和最后一个字符,同时从两端遍历比较字符是否一致。如果两个字符不同,则说明该字符串不是回文的,返回 false,如果两个字符相同,则继续往中间靠拢。当左指针大于等于右指针时,说明该字符串是回文的,返回 true。函数 partition 的功能是将一个字符串 s 拆分成回文子串的所有可能组合。该函数首先定义了一个空数组 ans,后面用于存储所有可能的回文组合情况。然后定义了一个递归函数 subStr,用于在字符串中从前往后依次尝试组合每一个回文子串。函数 subStr 接收三个参数,分别是当前遍历到的字符在字符串中的下标 index、当前组合的字符串 str、已组合好的子串数组 arr。函数 subStr 的主体是一个循环体,该循环体的作用是对下一个字符进行判断和组合。首先尝试将下一个字符添加到当前组合字符串 str 后面,继续递归调用 subStr。然后判断当前组合字符串是否是回文的,如果不是回文的,则直接返回。如果是回文的,则将当前组合字符串 str 添加到已组合好的子串数组 arr 中,再递归调用 subStr 继续向后组合,同时将已组合好的子串数组 arr 作为参数传入下一个递归调用。当所有字符都遍历完成后,将已组合好的子串数组 arr 添加到结果集数组 ans 中。最后,函数 partition 在调用递归函数 subStr 时,传入当前遍历到的第一个字符和一个空的已组合好的子串数组 []。当递归函数 subStr 执行完成后,函数 partition 将结果集 ans 返回

 var isPalindrome = function(s) {
      let token = s.split("");
      if(token.length === 0) return true;
      let i = 0,j = token.length-1;
      while(j>i){
          if(token[i] === token[j]){
              i++;j--;
          }else{
              return false;
          }
      }
      return true;
  };
  var partition = function(s) {
      let len = s.length;
      let ans = [];
      function subStr(index,str,arr){
          if(index>=len){
              ans.push(arr.slice());
              return;
          }
          if(index+1<len) subStr(index+1,str+s[index+1],arr);
          if(!isPalindrome(str)) return;
          arr.push(str);
          subStr(index+1,s[index+1],arr);
          arr.pop();
      }
      subStr(0,s[0],[]);
      return ans;
  }
相关文章
|
2月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
1月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
21 0
|
3月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
3月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
3月前
|
算法 C++
第一周算法设计与分析 E : 构造回文串
这篇文章介绍了解决算法问题"构造回文串"的方法,即判断给定的整数N(视为字符串)是否可以通过在前面添加任意个0(或不添加)来构造一个回文串,并给出了相应的C++代码实现。
|
3月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
287 1
|
3月前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
74 1
|
3月前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
173 1
|
30天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
7天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
下一篇
无影云桌面