题目:
str:="babac"
list:=[]string{"ba","c","abcd"}
给定的list表示一张张字符的贴纸,你可以剪下字母拼贴成str字符串的样子,问需要的最少贴纸数
分析:
用一张字典的表记录目标字符串的字母以及数量,字典的key是一个个字母,value是数量,每一个list的元素中的字母从字典减去对应的值,当字典的value的和变成0终止
代码:
package main
import (
"fmt"
"math"
)
func process(list []string,m map[string]int,rest,index,use int)int{
if rest<=0{
return use
}
if index>=len(list){
if rest<=0{
return use
}else{
return -1
}
}
for i :=0;i<len(list[index]);i++{
m[string(list[index])]-=1
if rest>0{
rest-=1
}
}
use+=1
p1:=process(list,m,rest,index+1,use)
p2:=process(list,m,rest,index+2,use)
if p1==-1 && p2 !=-1{
return p2
}
if p2==-1 && p1 !=-1{
return p1
}
return int(math.Min(float64(p1),float64(p2)))
}
func paster(str string,list []string) int{
m:=make(map[string]int)
count:=0
for i :=0;i<len(str);i++{
m[string(str[i])]+=1
count+=1
}
fmt.Println(m,count)
// fmt.Println(process(list,m,count,0,0))
return int(math.Min(float64(process(list,m,count,0,0)),float64(process(list,m,count,1,0))))
}
func main(){
str:="babac"
list:=[]string{"ba","c","abcd"}
fmt.Println(paster(str,list))
}
总结:
map的值减到0时不能再减,因为要计算总和,不能出现-负值