算法记录Day 27 | 回溯算法part04

49 阅读1分钟

算法记录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]
	}
}