leetcode day 27 39. 组合总和 40.组合总和II 131.分割回文串

文章目录

  • 一、leetcode 39. 组合总和
    • 1.题目链接:
    • 2.独立做题问题总结
    • 3.解法总结:
  • 二、leetcode 40.组合总和II §§§§§
    • 1.题目链接:
    • 2.独立做题问题总结
    • 3.解法总结:
  • 三、leetcode 131.分割回文串 §§§§§
    • 1.题目链接:
    • 2.独立做题问题总结
    • 3.解法总结:


提示:以下是本篇文章正文内容,下面案例可供参考

一、leetcode 39. 组合总和

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

  1. 回溯
		def backtracking(candidates, target, startindex):
            nonlocal store
            if sum(store) > target:
                return
            if sum(store) == target:
                res.append(store[:])
                return
            for i in range(startindex, len(candidates)):
                store.append(candidates[i])
                backtracking(candidates, target, i)
                store.pop()
        res = []
        store = []
        backtracking(candidates, target, 0)
        return res
		
  1. 剪枝
		def backtracking(candidates, target, startindex):
            nonlocal store
            nonlocal sum
            if sum > target:
                return
            if sum == target:
                res.append(store[:])
                return
            
            for i in range(startindex, len(candidates)):
                if sum < target:#剪枝
                    sum += candidates[i]
                    
                    store.append(candidates[i])
                    backtracking(candidates, target, i)
                    sum -= candidates[i]
                    store.pop()
        res = []
        store = []
        sum = 0
        backtracking(candidates, target, 0)
        return res

二、leetcode 40.组合总和II §§§§§

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

  1. 去重+回溯
    §树层去重:12考虑过以后就不用考虑21的情况

树枝去重:(store里可以取相同元素

定义used数组candidates中元素进行标记:对加入元素的位数进行置1操作,若用过记为1,没用过记为0
leetcode day 27 39. 组合总和 40.组合总和II 131.分割回文串_第1张图片
used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
used[i - 1] == false,说明同一树层candidates[i - 1]使用

		def backtracking(candidates, target, startindex):
            nonlocal used
            nonlocal store
            nonlocal res
            if sum(store) > target:
                return
            if sum(store) == target:
                res.append(store[:])
                return
            for i in range(startindex, len(candidates)):
                if i > 0 and candidates[i - 1] == candidates[i] and used[i - 1] == 0:
                    continue
                if sum(store) < target:
                    store.append(candidates[i])
                    used[i] = 1
                    backtracking(candidates, target, i + 1)
                    used[i] = 0
                    store.pop()
        res = []
        used = [0] * len(candidates)
        store = []
        if sum(candidates) < target:
            return []
        candidates.sort()
        backtracking(candidates, target, 0)
        return res
		
  1. 用startindex去重:
    // 要对同一树层使用过的元素进行跳过
    if (i > startIndex && candidates[i] == candidates[i - 1]) {
    continue;
    }

三、leetcode 131.分割回文串 §§§§§

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

  1. 回溯
    对于字符串abcdef:
    组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中在选组第三个…。
    切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中在切割第三段…。
    !!当前切割区间为s[startindex: i + 1]
    !!当当前切割情况不满足回文时,continue (i+1
    !! 当startindex == len(s)时,存store,即切割到最后一位了
    leetcode day 27 39. 组合总和 40.组合总和II 131.分割回文串_第2张图片
		def backtracking(s, startindex):
            nonlocal store
            nonlocal res
            if startindex == len(s):
                res.append(store[:])
                return
            for i in range(startindex, len(s)):
                # print(s)
                cur = s[startindex: i + 1]
                if len(cur) != 0 and cur[::-1] == cur:#注意len(cur)不能为0,否则会被存入
                    store.append(cur)
                    # print(cur)
                else:
                    continue
                backtracking(s, i + 1)
                store.pop()
        res = []
        store = []
        backtracking(s, 0)
        return res	
		

你可能感兴趣的:(leetcode,leetcode,算法,职场和发展)