算法训练营day23(补),回溯3

import (

"sort"

)

39. 组合总和

func combinationSum(candidates []int, target int) [][]int {

//存储全部集合

result := make([][]int, 0)

if len(candidates) == 0 {

return result

}

sort.Ints(candidates) //排序后面做剪枝

//存储单次集合

path := make([]int, 0)

var backtrace func(candidates []int, target int, startIndex int)

backtrace = func(candidates []int, target int, startIndex int) {

if target == 0 {

temp := make([]int, len(path))

copy(temp, path)

result = append(result, temp)

return

}

for i := startIndex; i < len(candidates); i++ {

if candidates[i] > target { //剪枝

break

}

path = append(path, candidates[i])

backtrace(candidates, target-candidates[i], i)

//回溯处理

path = path[:len(path)-1]

}

}

backtrace(candidates, target, 0)

return result

}

40. 组合总和 II

func combinationSum2(candidates []int, target int) [][]int {

//存储全部集合

result := make([][]int, 0)

if len(candidates) == 0 {

return result

}

sort.Ints(candidates) //排序后面做剪枝

//记录数组每一个元素是否使用过

user := make([]bool, len(candidates))

//存储单次集合

path := make([]int, 0)

var backtrace func(candidates []int, target int, startIndex int)

backtrace = func(candidates []int, target int, startIndex int) {

if target == 0 {

temp := make([]int, len(path))

copy(temp, path)

result = append(result, temp)

return

}

for i := startIndex; i < len(candidates); i++ {

if candidates[i] > target { //剪枝

break

}

if i > 0 && candidates[i] == candidates[i-1] && user[i-1] == false { //过滤重复

continue

}

path = append(path, candidates[i])

user[i] = true

backtrace(candidates, target-candidates[i], i+1)

//回溯处理

path = path[:len(path)-1]

user[i] = false

}

}

backtrace(candidates, target, 0)

return result

}

//判断是否是回文

func isPalindrome(s string) bool {

for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {

if s[i] != s[j] {

return false

}

}

return true

}

131. 分割回文串

func partition(s string) [][]string {

//存储全部集合

result := make([][]string, 0)

if len(s) == 0 {

return result

}

//存储单次集合

path := make([]string, 0)

var backtrace func(se string, startIndex int)

backtrace = func(se string, startIndex int) {

if startIndex == len(se) {

temp := make([]string, len(path))

copy(temp, path)

result = append(result, temp)

return

}

for i := startIndex; i < len(se); i++ {

//对字符串进行切割

str := se[startIndex : i+1]

if isPalindrome(str) {

path = append(path, str)

backtrace(se, i+1)

//回溯处理

path = path[:len(path)-1]

}

}

}

backtrace(s, 0)

return result

}

相关推荐
焦耳加热1 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
CodeCraft Studio1 小时前
PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 Base64
开发语言·python·pdf·base64·aspose·aspose.pdf
零点零一1 小时前
VS+QT的编程开发工作:关于QT VS tools的使用 qt的官方帮助
开发语言·qt
wan5555cn2 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u6062 小时前
常用排序算法核心知识点梳理
算法·排序
程序员爱钓鱼2 小时前
Go语言实战案例 — 工具开发篇:实现一个图片批量压缩工具
后端·google·go
lingchen19064 小时前
MATLAB的数值计算(三)曲线拟合与插值
开发语言·matlab
gb42152874 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
一朵梨花压海棠go4 小时前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript
蒋星熠4 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程