算法训练营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 candidatesi > target { //剪枝

break

}

path = append(path, candidatesi)

backtrace(candidates, target-candidatesi, 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 candidatesi > target { //剪枝

break

}

if i > 0 && candidatesi == candidatesi-1 && useri-1 == false { //过滤重复

continue

}

path = append(path, candidatesi)

useri = true

backtrace(candidates, target-candidatesi, i+1)

//回溯处理

path = path:len(path)-1

useri = 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 si != sj {

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 := sestartIndex : i+1

if isPalindrome(str) {

path = append(path, str)

backtrace(se, i+1)

//回溯处理

path = path:len(path)-1

}

}

}

backtrace(s, 0)

return result

}

相关推荐
fpcc5 小时前
算法和数据结构—动态规划法
数据结构·算法·动态规划
IKUN家族6 小时前
SpringBoot日志
java·开发语言
迷迭香yy6 小时前
Python构建转融券多空识别系统从接口到因子的全流程 IG50免费开源股票数据API接口
开发语言·python·开源
格林威6 小时前
C#图像快速剪切:使用OpenCvSharp和Halcon优化图像剪切和CPU占用
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
知识分享小能手6 小时前
概理论与数理统计学习教程,从入门到精通,在数理统计中应用R软件(22)
开发语言·学习·r语言
乐观勇敢坚强的老彭6 小时前
C++信奥GESP四级的常见题型和解题模板速查表
开发语言·c++
denggun123457 小时前
信号量(DispatchSemaphore vs AsyncSemaphore)、swift协作式线程池 and python信号量
开发语言·python·swift
lisw057 小时前
计算与科学哲学(Philosophy of Computing and Science)
java·开发语言·人工智能
深念Y7 小时前
为什么选 Go:直观、可维护、AI 友好
linux·开发语言·人工智能·golang·agent·harness
Billy121387 小时前
Day25-编译期计算与 constexpr if:跨越编译与运行的边界
开发语言·c++进阶学习