216.组合总和III
这道题与77、组合题思路相同,不过是多了一个判定条件即可。需要注意的是copy函数是空切片在前,原切片在后。
func combinationSum3(k int, n int) [][]int {
ret := make([][]int, 0)
path := make([]int, 0)
var getpath func(int, int)
getpath = func(start, sum int){
if len(path) > k{
return
}
if len(path) == k && sum == n{
tmp := make([]int, k)
copy(tmp,path )
ret = append(ret, tmp)
}
for i := start; i <= 9; i++{
sum += i
path = append(path, i)
getpath(i + 1, sum)
sum -= i
path = path[:(len(path) - 1)]
}
}
getpath(1,0)
return ret
}
17.电话号码的字母组合
总的思路还是相同的,需要利用回溯的算法。
不过这次迭代的次数就是号码的长短。
每次迭代中分别负责一个号码所对应的几个字符。
func letterCombinations(digits string) []string {
if len(digits) == 0{
return []string(nil)
}
hash := make(map[byte]string, 0)
hash['2'] = "abc"
hash['3'] = "def"
hash['4'] = "ghi"
hash['5'] = "jkl"
hash['6'] = "mno"
hash['7'] = "pqrs"
hash['8'] = "tuv"
hash['9'] = "wxyz"
ret := make([]string, 0)
path := make([]byte, 0)
var getpath func(int)
getpath = func( num int){
if len(path) == len(digits){
ret = append(ret, string(path))
return
}
key := digits[num]
for i := 0; i < len(hash[key]); i++{
path = append(path, hash[digits[num]][i])
getpath(num + 1)
path = path[:(len(path) - 1)]
}
}
getpath(0)
return ret
}