回溯算法题
回溯的for循环梯次
同一个梯次的for循环的结果表示在本梯次的不同结果
1,字符串切割为回文子串----131
最重要的两个使用参数:
(1)起始下标(2)切割长度
切得回文子串---保存,下一个
切得的子串不是回文串:
(1)抛弃最后的字符,保存前面的----不可,前面的已经处理过了,只能往后切割。
(2)增加切割长度往后切割。
同一级的子串分割是从短到长的,所以只能增不能减。
同一级别子串需要重新分割时,就需要从数组中清楚,重新装填。
全排列1(没有重复数据)-----46
全排列同一梯次取值是所有值,通过find排除
全排列2(有重复数据)-----47
这个题需要解决两个问题:
1,标记某一个元素在本路径已经访问过;
2,防止重复路径:
重复路径是怎么出现的---同一梯次使用相同元素
if(i>0&&nums[i]==nums[i-1]&&!visited[i-1]) continue;
11----11 11
相同元素在相同梯次会形成相同路径
所以这个题排列之前先排序
组合(返回范围 [1, n]
中所有可能的 k
个数的组合)-----77
不需要考虑下标i的范围,i>n ,for循环自动退出。
组合同一梯次取值需要往后取
同一梯次取所有值和往后取理由就是,12,21是不是组合还是排列。
组合总和1(元素可以重复使用)-----39
只管不断加,大于退出就行
组合总和2(元素不可以重复使用而且有重复元素,结果不能有重复组合)-----40
结果不能有重复组合-----同一梯次的相同元素不再使用就可以保证不会出现重复组合。
if(i>startIndex&&nums[i]==nums[i-1]) continue;
无论是全排列2还是组合总和2下标都要大于本梯次的起始下标
都要先排序
全排列和组合总和两两对称
路径总和1-----112
路径总和2-----113
路径总和和链表反转都是5行代码实现。
子集1-----78
子集2-----90
同一梯次不能使用相同元素
全排列,组合,子集两两对称