算法记录Day 25 | 回溯算法part02

80 阅读1分钟

算法记录Day 25 | 回溯算法part02

LeetCode 216.组合总和III

题目链接:216. 组合总和 III

题解
func combinationSum3(k int, n int) [][]int {
	result := make([][]int, 0)
	dfs(k, n, 1, 0, []int{}, &result)
	return result
}

func dfs216(k int, n int, start int, sum int, path []int, result *[][]int) {
	if sum > n || len(path) > k {
		return
	}
	if len(path) == k {
		if sum == n {
			temp := make([]int, len(path))
			copy(temp, path)
			*result = append(*result, temp)
		}
		return
	}

	for i := start; i <= 9; i++ {
		sum += i
		path = append(path, i)
		dfs(k, n, i+1, sum, path, result)
		sum -= i
		path = path[:len(path)-1]
	}
}

LeetCode 17.电话号码的字母组合

题目链接:17. 电话号码的字母组合

题解
package suixianglu

func letterCombinations(digits string) []string {
	if digits == "" {
		return []string{}
	}
	result := make([]string, 0)
	dfs17(digits, 0, []byte{}, &result)
	return result
}

var m = []string{"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}

func dfs17(digist string, start int, path []byte, result *[]string) {
	if len(path) == len(digist) {
		*result = append(*result, string(path))
		return
	}
	s := int(digist[start] - '0')
	letter := m[s-2]
	for i := 0; i < len(letter); i++ {
		path = append(path, letter[i])
		dfs17(digist, start+1, path, result)
		path = path[:len(path)-1]
	}
}