理解回溯算法,解答力扣的分割回文串一题

一、回溯算法是什么

        回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。

        上一段话复制于百度,我的理解如下图所示

        一开始,有3,5,9三个节点可走,从1开始,2,3,4不符合条件,返回上一节点,从5开始,发现6,7,8不合适返回上一节点,从9开始,以此类推,若不合适,回到上一节点,走其他节点,直到找到结果或无解,这是我理解的回溯,如果有什么问题欢迎留言指出。

二、力扣算法题,分割回文串

        直接上代码+注释

/**
 * @param {string} s
 * @return {string[][]}
 */
var partition = function(s) {
    var res = []
    var cache = []
    // 判断是否是回文串
    const isPalindrome = (str,start,end) => {
        var i = start
        var j = end
        while(i < j) {
            if(str[i] !== str[j]) return false
            i++
            j--
        }
        return true
    }
    // 回溯找出所有符合条件的回文串
   function backtrack(start) {
       // 一直循环完还符合条件,是回文串,加入res数组
       if(start >= s.length) {
           res.push([...cache])
           return
       }

       for(var i = start;i < s.length;i++) {
           // 如果不是回文串,拉长子串长度看是不是回文串 如ab不是aba是
           // 如果循环完都不是回文串,start还是初始值,不会加入res数组
           if(!isPalindrome(s,start,i)) continue
           // 先把符合的回文串放进cache数组
           cache.push(s.slice(start,i + 1))
           // 递归把后面符合条件的子串放入cache数组
           backtrack(i + 1)
           // 如果递归没有return掉、存进res数组,说明不符合 移除
           cache.pop()
       }
   }
   backtrack(0)
   return res
}

猜你喜欢

转载自blog.csdn.net/weixin_67941232/article/details/126787175