首页 > 其他分享 >一起学习LeetCode热题100道(61/100)

一起学习LeetCode热题100道(61/100)

时间:2024-08-29 10:25:49浏览次数:11  
标签:分割 start current 61 回溯 字符串 100 LeetCode 回文

61.分割回文串(学习)

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

示例 1:
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]

示例 2:
输入:s = “a”
输出:[[“a”]]

提示:
1 <= s.length <= 16
s 仅由小写英文字母组成

解析:
一、变量定义
1.result:一个数组,用于存储所有可能的分割方案。
2.current:一个数组,用于在回溯过程中构建当前的分割方案。

二、辅助函数:isPalindrome
1.这个函数检查传入的字符串str是否是回文串。它通过比较字符串的首尾字符,并逐步向中心移动,来验证整个字符串是否对称。

三、回溯函数:backtrack
1.这是解决问题的核心函数。它使用回溯算法来尝试所有可能的分割方式。
2.基准情况:如果start等于字符串s的长度,说明已经遍历完整个字符串,此时将current(当前的分割方案)添加到result中。
3.循环遍历:从start开始,遍历字符串s的剩余部分。对于每个位置i,截取从start到i(包含i)的子串。
4.检查回文:使用isPalindrome函数检查截取的子串是否是回文串。
5.添加并继续:如果是回文串,则将其添加到current中,并递归调用backtrack(i + 1)来继续处理剩余的字符串。
6.撤销选择:回溯结束后,需要从current中移除最后添加的子串,以便尝试其他可能的分割方式。

四、调用回溯函数
1.在partition函数的末尾,通过调用backtrack(0)开始回溯过程,从字符串的起始位置开始尝试所有可能的分割。

var partition = function (s) {
    const result = [];
    const current = [];

    // 辅助函数:检查子串是否是回文串  
    function isPalindrome(str) {
        let left = 0;
        let right = str.length - 1;
        while (left < right) {
            if (str[left] !== str[right]) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }

    // 回溯函数  
    function backtrack(start) {
        // 如果已经遍历完整个字符串,则将当前分割方案添加到结果中  
        if (start === s.length) {
            result.push([...current]);
            return;
        }

        for (let i = start; i < s.length; i++) {
            // 截取从start到i的子串  
            const substring = s.substring(start, i + 1);
            // 检查子串是否是回文串  
            if (isPalindrome(substring)) {
                // 如果是回文串,则将其添加到当前分割方案中  
                current.push(substring);
                // 继续向后回溯  
                backtrack(i + 1);
                // 回溯结束,撤销选择  
                current.pop();
            }
        }
    }

    backtrack(0);
    return result;
};```

标签:分割,start,current,61,回溯,字符串,100,LeetCode,回文
From: https://blog.csdn.net/weixin_53224223/article/details/141671669

相关文章

  • saveBatch时 遇到Duplicate entry '1828978156126666754' for key
    问题:saveBatch时遇到Duplicateentry'1828978156126666754'forkey分析:1.检查数据库里是否有重复ID      2.检查代码中是否有id赋值     3.       以上排查都没发现问题,以下代码分析了一下,为了节省空间,我在for循环上面new了一个封装类,......
  • 力扣热题100_贪心算法_45_跳跃游戏
    文章目录题目链接解题思路解题代码题目链接45.跳跃游戏II给定一个长度为n的0索引整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向前跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意nums[i+j]处:0<=j<=nums[i]......
  • leetcode215. 数组中的第K个最大元素,小根堆/快排思想
    leetcode215.数组中的第K个最大元素给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。你必须设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:[3,2,1,5,6,4],k=2......
  • cs61b-java
    java类和函数下面两端代码定义在dog类中,所不同的是一个是静态方法,一个是非静态方法。publicstaticvoidmakenoise(){ System.out.println("bark!");}publicvoidmakethenoise(){ if(weight<10) { System.out.println("wuwuwu!"); } elesif(weight<30) { Syst......
  • LeetCode 面试经典 150 题回顾
    目录一、数组/字符串1.合并两个有序数组 (简单)2.移除元素 (简单)3.删除有序数组中的重复项 (简单)4.删除有序数组中的重复项II(中等)5.多数元素(简单)6.轮转数组 (中等)7.买卖股票的最佳时机(简单)8.买卖股票的最佳时机II (中等)9.跳跃游戏(中等)10.跳跃游戏II(中等)11.H指......
  • LeetCode - 1 两数之和
    题目来源1.两数之和-力扣(LeetCode)题目描述给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案......
  • 单调队列--滑动窗口最大值(leetcode23)
    目录一、单调队列介绍二、题目应用1.题目描述2.解题碎碎念3.代码示例三、扩展1.与优先队列区别2.单调队列其他题目一、单调队列介绍单调队列是一种特殊的队列数据结构,它能够在常数时间内找到队列中的最值。单调队列可以用来解决一些与最值相关的问题,例如滑动窗口最......
  • 代码随想录算法day24 | 贪心算法part02 | 122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳
    122.买卖股票的最佳时机II本题解法很巧妙,本题大家可以先自己思考一下然后再看题解,会有惊喜!力扣题目链接(opensnewwindow)给定一个数组,它的第 i个元素是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次......
  • 56. 合并区间【 力扣(LeetCode) 】
    一、题目描述  以数组intervals表示若干个区间的集合,其中单个区间为intervals[i]=[starti,endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。二、测试用例示例1:输入:intervals=[[1,3],[2,6],[8,10],[15,18]]输......
  • 【Hot100】LeetCode—39. 组合总和
    目录1-思路2-实现⭐39.组合总和——题解思路3-ACM实现题目连接:39.组合总和1-思路注意如果借助startIndex实现,理解startIndex的含义在本题目中,由于同一个元素可以重复选取,因此startIndex在传递的过程中,不需要进行+1操作,传递的值为i2-实现⭐39......