#小全不努力怎么行#
题目:子集II。给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。ps:解集不能包含重复的子集。
解:回溯。也要用到去重思想,去重参照组合总和II。调用回溯之前需要对nums进行sort排序。递归出口被包含在for循环里了,if (start>nums.size())。
used[i - 1] == true,说明同一树枝candidates[i - 1]使用过;used[i - 1] == false,说明同一树层candidates[i - 1]使用过。我们要对同一树层使用过的元素进行跳过,if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false) continue; 否则cur.push_back、used更新、递归i+1,并回溯。
(本题也可以不使用used数组来去重,因为递归的时候下一个startIndex是i+1而不是0。如果要是全排列的话,每次要从0开始遍历,为了跳过已入栈的元素,需要使用used。
题目:子集II。给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。ps:解集不能包含重复的子集。
解:回溯。也要用到去重思想,去重参照组合总和II。调用回溯之前需要对nums进行sort排序。递归出口被包含在for循环里了,if (start>nums.size())。
used[i - 1] == true,说明同一树枝candidates[i - 1]使用过;used[i - 1] == false,说明同一树层candidates[i - 1]使用过。我们要对同一树层使用过的元素进行跳过,if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false) continue; 否则cur.push_back、used更新、递归i+1,并回溯。
(本题也可以不使用used数组来去重,因为递归的时候下一个startIndex是i+1而不是0。如果要是全排列的话,每次要从0开始遍历,为了跳过已入栈的元素,需要使用used。
#小全不努力怎么行#
题目:子集。给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解:回溯。递归终止条件:index>=nums.size()或者cur.size()>=nums.size();其实可以不需要加终止条件,因为startIndex >= nums.size(),本层for循环本来也结束了。每次开头先把cur push进result里。然后for 回溯i+1。
题目:子集。给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解:回溯。递归终止条件:index>=nums.size()或者cur.size()>=nums.size();其实可以不需要加终止条件,因为startIndex >= nums.size(),本层for循环本来也结束了。每次开头先把cur push进result里。然后for 回溯i+1。
#小全不努力怎么行#
题目:分割回文串。将字符串 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
解:回溯。递归终止条件: 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了,cur push进result,并return。for循环i =index->s.size();[index, i] 就是要截取的子串。首先判断这个子串是不是回文,如果是回文,就加入到cur中并递归下一层and回溯;如果不是则continue直接跳过。
(在判断是否为回文串时有优化空间,如p3:例如给定字符串"abcde", 在已知"bcd"不是回文字串时, 不再需要去双指针操作"abcde"而可以直接判定它一定不是回文字串。
具体来说, 给定一个字符串s, 长度为n, 它成为回文字串的充分必要条件是s[0] == s[n-1]且s[1:n-1]是回文字串。
根据动态规划算法, 可以高效地事先一次性计算出, 针对一个字符串s, 它的任何子串是否是回文字串, 然后在我们的回溯函数中直接查询即可, 省去了双指针移动判定这一步骤.
题目:分割回文串。将字符串 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
解:回溯。递归终止条件: 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了,cur push进result,并return。for循环i =index->s.size();[index, i] 就是要截取的子串。首先判断这个子串是不是回文,如果是回文,就加入到cur中并递归下一层and回溯;如果不是则continue直接跳过。
(在判断是否为回文串时有优化空间,如p3:例如给定字符串"abcde", 在已知"bcd"不是回文字串时, 不再需要去双指针操作"abcde"而可以直接判定它一定不是回文字串。
具体来说, 给定一个字符串s, 长度为n, 它成为回文字串的充分必要条件是s[0] == s[n-1]且s[1:n-1]是回文字串。
根据动态规划算法, 可以高效地事先一次性计算出, 针对一个字符串s, 它的任何子串是否是回文字串, 然后在我们的回溯函数中直接查询即可, 省去了双指针移动判定这一步骤.
✋热门推荐