算法记录Day 27 | 回溯算法part04
LeetCode 93.复原IP地址
题目链接:93. 复原 IP 地址
题解
import "strings"
func restoreIpAddresses(s string) []string {
res := make([]string, 0)
dfs93(s, 0, []string{}, &res)
return res
}
func dfs93(s string, startIndex int, path []string, res *[]string) {
if len(path) == 4 {
if startIndex == len(s) {
temp := strings.Join(path, ".")
*res = append(*res, temp)
}
return
}
for i := startIndex; i < len(s); i++ {
str := s[startIndex : i+1]
if isValid(s, startIndex, i) {
path = append(path, str)
dfs93(s, i+1, path, res)
path = path[:len(path)-1]
}
}
}
func isValid(s string, start int, end int) bool {
if start > end {
return false
}
if s[start] == '0' && start != end {
return false
}
num := 0
for i := start; i <= end; i++ {
if s[i] > '9' || s[i] < '0' {
return false
}
num = num*10 + int(s[i]-'0')
if num > 255 {
return false
}
}
return true
}
LeetCode 78.子集
题目链接:78. 子集
题解
func subsets(nums []int) [][]int {
res := make([][]int, 0)
dfs78(nums, 0, []int{}, &res)
return res
}
func dfs78(nums []int, start int, path []int, res *[][]int) {
temp := make([]int, len(path))
copy(temp, path)
*res = append(*res, temp)
for i := start; i < len(nums); i++ {
path = append(path, nums[i])
dfs78(nums, i+1, path, res)
path = path[:len(path)-1]
}
}
LeetCode 90.子集II
题目链接:90. 子集 II
题解
import "sort"
func subsetsWithDup(nums []int) [][]int {
res := make([][]int, 0)
used := make([]bool, len(nums))
sort.Ints(nums)
dfs90(nums, 0, used, []int{}, &res)
return res
}
func dfs90(nums []int, start int, used []bool, path []int, res *[][]int) {
temp := make([]int, len(path))
copy(temp, path)
*res = append(*res, temp)
for i := start; i < len(nums); i++ {
if i > start && nums[i] == nums[i-1] && !used[i-1] {
continue
}
used[i] = true
path = append(path, nums[i])
dfs90(nums, i+1, used, path, res)
used[i] = false
path = path[:len(path)-1]
}
}