代码随想录算法训练营Day27|39.组合总和、40.组合总和II、131.分割回文串

一、39 组合总和

  1. 题目链接:https://leetcode.cn/problems/combination-sum/

  1. 思路:和组合问题基本相似,只不过是将i+1替换成为了i,这样认为它可以从当前的这一个元素重复使用。

  1. 代码:

var combinationSum = function(candidates, target) {
    var result = []
    var backtracking = function(startIndex, path) {
        var sum = 0;
        for (let i=0; i<path.length; i++) {
            sum += path[i];
        }
        if (sum > target) {
            return;
        }
        else if (sum == target) {
            result.push(path.slice(0));
            return;
        }
        for (let i=startIndex; i<candidates.length; i++) {
            path.push(candidates[i]);
            // 这里,不是i+1而是i,代表可以选择重复的
            backtracking(i, path);
            path.pop();
        }
    }
    backtracking(0, []);
    return result;
};

二、40 组合总和II

  1. 题目链接:https://leetcode.cn/problems/combination-sum-ii/

  1. 思路:如果是不能出现相同的数据,则一层当中不能两次采用相同的进入循环

  1. 代码:

var combinationSum2 = function(candidates, target) {
    var result = [];
    // 箭头函数只有一行不需要写大括号,且直接返回,不然需要写return
    candidates.sort((a, b) => b-a);
    var backtracking = function(startIndex, path) {
        var sum = 0;
        for (let i=0; i<path.length; i++) {
            sum += path[i];
        }
        if (sum > target) {
            return;
        }
        else if (sum == target) {
            result.push(path.slice(0));
            return;
        }
        for (let i=startIndex; i<candidates.length; i++) {
            // 一层中不能有两个相同的数进入递归
            if (i > startIndex && candidates[i] == candidates[i - 1]) {
                continue;
            }
            path.push(candidates[i]);
            // 不能重复使用同一个数,所以从下一个开始
            backtracking(i+1, path);
            path.pop();
        }
    }
    backtracking(0, []);
    return result;
};

三、131 分割回文串

  1. 题目链接:https://leetcode.cn/problems/palindrome-partitioning/

  1. 思路:如果是一个集合求组合的话,需要startIndex,如果是多个集合独立开求组合的话,就不需要startIndex,这里是定义了一个是否为回文字符串的函数,如果从startIndex开始的一段字符串是回文串,那么就可以,然后从下一个字符开始递归。

  1. 代码:

var partition = function(s) {
    var result = [];
    var isPalindrome = function(str) {
        var arr = Array.from(str);
        var left = 0;
        var right = str.length - 1;
        while (left <= right) {
            if (arr[right] != arr[left]) {
                return false;
            }
            right--;
            left++;
        }
        return true;
    } 
    var backtracking = function(startIndex, path) {
        if (startIndex >= s.length) {
            result.push(path.slice(0));
            return;
        }
        for (let i=startIndex; i<s.length; i++) {
            if (isPalindrome(s.slice(startIndex, i+1))) {
                path.push(s.slice(startIndex, i+1));
            }
            // 如果当前的子串不是回文子串,则不需要对后面的进行递归,而是看看向右移一位会不会是回文串
            else {
                continue;
            }
            backtracking(i+1, path);
            path.pop();
        }
    }
    backtracking(0, []);
    return result;
};

今日学习时长:1.5h左右

总结:今天的题相对有点难,包括重复数值的选取等等,再刷的时候需要再注意一下131题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值