最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 前端算法必刷题系列[71]

    正文概述 掘金(文斌大大鸟)   2021-06-25   309

    这是我参与更文挑战的第 24 天,活动详情查看 更文挑战

    135. 分割回文串 (palindrome-partitioning)

    标签

    • 字符串
    • 中等

    题目

    leetcode 传送门

    这里不贴题了,leetcode打开就行,题目大意:

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

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

    示例 1

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

    示例 2

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

    基本思路

    第一步,先拆解问题

    • 首先我们得有一个判断是否是回文的方法,入参 str 返回 true/false
    • 因为我们的输出是枚举所有切分方法,自然而然想到 DFS + 回溯,如果这个不熟,请移步这篇 讲了这个的基本套路。

    因为是找出所有切分的可能,其实跟全排列差不多,这种问题都是 dfs + 回溯,其实就是看成如何切割这个长串,每一刀都要切出一个回文串,直到结尾。要找到所有状态,就要回溯,思考上刀不切还有没有路可走。也就是回到选择前的状态,去考察另一个选择,进入下一轮迭代,尝试另一种切分的可能。最后输出所有的合法解集。

    这题dfs的基本步骤就是

    • cur指针已经走到尾部,说明结束了,结果进 res
    • 遍历之后的字符,判断下一刀切在哪(满足回文)
      • 将它加入部分解数组,继续递归往下切(左边已经都是回文串了),并回溯,找寻其他切法
      • 当前这刀不是回文,跳过该选择,i 往下走

    写法实现

    var partition = function(s) {
        const res = []
        // 子问题1:双指针判断回文,从两端指到中间
        const isPalindrome = (left, right) => {
            while (left < right) {
                if (s[left] !== s[right]) {
                    return false
                }
                left++;
                right--;
            }
            return true
        }
        const dfs = (subArr, cur) => {
            // cur指针已经走到尾部,说明结束了,结果进 res
            if (cur === s.length) {
                // res 是数组注意复制下
                res.push(subArr.slice());
                return;
            }
            // 遍历接下来的情况
            for (let i = cur; i < s.length; i++) {
                // 如果发现当前[cur, i]是回文了
                if (isPalindrome(cur, i)) {
                    // 正确回文子串推入
                    subArr.push(s.substring(cur, i + 1));
                    // 递归,找当前定下了一个子串之后的下一层选择
                    dfs(subArr, i + 1);
                    // 回溯,找寻其他解法
                    subArr.pop();
                }
            }
        }
    
        dfs([], 0)
        return res
    };
    
    let s = "aab"
    console.log(partition(s))
    // 输出:[["a","a","b"],["aa","b"]]
    

    今天有事,要去踢球,就来一题哈。

    今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦 点击此处交个朋友 Or 搜索我的微信号infinity_9368,可以聊天说地 加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我 presious tower shock the rever monster,我看到就通过,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧

    参考


    起源地下载网 » 前端算法必刷题系列[71]

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元