131. 分割回文串回溯Normal

Posted pre_eminent

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了131. 分割回文串回溯Normal相关的知识,希望对你有一定的参考价值。

131. 分割回文串

难度中等

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。

返回 s 所有可能的分割方案。

回文串 是正着读和反着读都一样的字符串。


示例 1:

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

示例 2:

输入:s = "a"
输出:[["a"]]

提示:

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

思路:

1. 回溯参数:startIndex

2. 递归终止条件:startIndex === str.length

3. 双指针判断回文串

4. 只有回文串,才做作选择添加到path,进入下一层递归


解答:

/**
 * @param string s
 * @return string[][]
 */
var partition = function(s) 
    let path = [];
    let res = [];
    let startIndex = 0;
    backtrack(s, startIndex, path, res);
    return res;
;

function backtrack(s, startIndex, path, res)
    // 递归终点,结束条件
    if(startIndex >= s.length)
        let pathCopy = [...path];
        res.push(pathCopy);
        return;
    
    
    // 遍历所有选择
    for(let i = startIndex;i < s.length; i++)
        // 是回文,才作出选择,加入path
        if(isTrue(startIndex, i, s))
            // 注意参数2是截取的长度
            path.push(s.substr(startIndex, i - startIndex + 1));
         else 
            // 不是回文,直接跳过
            continue;
        
        // 是回文,作出选择后,才进入下一层
        backtrack(s, i + 1, path, res);
        // 撤销选择
        path.pop();
    


// 双指针判断回文串
function isTrue(l, r, s)
    let i = l, j = r;
    while(i < j)
        if(s.charAt(i) !== s.charAt(j))
            return false;
        
        i++;
        j--;
    
    return true;

以上是关于131. 分割回文串回溯Normal的主要内容,如果未能解决你的问题,请参考以下文章

131. 分割回文串-回溯算法 (leetcode)

131. 分割回文串

回溯算法--分割回文串

leetcode中等131分割回文串

代码随想录|day26|回溯算法part03● 39. 组合总和● 40.组合总和II● 131.分割回文串

LeetCode 131. 分割回文串(Palindrome Partitioning)