题目:
给定一个数字字符串,1可以转换成A,2转换成B,3 转换成C,10 转换成J…20转成成T,一次类推,返回有多少种转换的方法
分析:
根据提题意,当来到index[ i]的时候可以分成以下情况:
1 【i】==1,下一位不越界,当前i有两种方法
2 【i】==2 下一位不越界,且下一位值小于等于6,当前i有两种方法
3【i】在3-9之间 只有一种方法
4【i】==0,无法转换,返回失败
代码:
package main
import(
"fmt"
)
//题目要求返回多少种方法,所以以下只在于归纳有多找中可能的分支,统计每一种分支的sum
//并没有也不需要真的去转换,有一下四种分支:i==0,i==1,i==2,i in 3-9
func process(str string,i int) int{
if i==len(str){
return 1
}
if str[i]==48{//0,单独面对0字符,返回0种 这个分支走不通
return 0
}
if str[i]==49{//1 当前位置是1时,即自己可以转为A,也可以与后面数字转成J-S
res:=process(str,i+1)
if i+1
res+=process(str,i+2)
}
return res
}
if str[i]==50 {//2 当前位置数字是2,并且后面数字小于等于6,可以自己组成B,或者与后面数字组成T-Z
res:=process(str,i+1)
if i+1
res+=process(str,i+2)
}
return res
}
if int(str[i])>=51 && int(str[i])<=57{
return process(str,i+1)
}
return 0
}
动态规划:
package main
import(
"fmt"
)
//题目要求返回多少种方法,所以以下只在于归纳有多找中可能的分支,统计每一种分支的sum
//并没有也不需要真的去转换,有一下四种分支:i==0,i==1,i==2,i in 3-9
func process(str string,i int) int{
if i==len(str){
return 1
}
if str[i]==48{//0,单独面对0字符,返回0种 这个分支走不通
return 0
}
if str[i]==49{//1 当前位置是1时,即自己可以转为A,也可以与后面数字转成J-S
res:=process(str,i+1)
if i+1
res+=process(str,i+2)
}
return res
}
if str[i]==50 {//2 当前位置数字是2,并且后面数字小于等于6,可以自己组成B,或者与后面数字组成T-Z
res:=process(str,i+1)
if i+1
res+=process(str,i+2)
}
return res
}
if int(str[i])>=51 && int(str[i])<=57{
return process(str,i+1)
}
return 0
}
func process1(str string)int{
dp:= []int{}
n:=len(str)
for i:=0;i<=n+1;i++{
dp=append(dp,0)
}
dp[n]=1
// dp[n+1]=1
for i:=n-1;i>=0;i--{
// fmt.Println(string(str[i]))
// fmt.Printf("uiiiiiii %vn",i)
if str[i]==50{//2
res:=dp[i+1]
if i+1
dp[i]=res+dp[i+2]
}else{
dp[i]=res
}
}
if str[i]==49{//1
res:=dp[i+1]
if i+1
dp[i]=res+dp[i+2]
}else{
dp[i]=res
}
}
if str[i]==48{//0
dp[i]=0
}
if int(str[i])>=51 && int(str[i])<=57{
dp[i]=dp[i+1]
}
}
fmt.Println(dp)
fmt.Println(dp[0])
return dp[0]
}
func main(){
str:="111234567891112131415161718192122232425262728293"
fmt.Println(process(str,0))
fmt.Println(process1(str))
// fmt.Printf("%tn",int(str[4]))
// fmt.Printf("%vn",int(str[len(str)-1]))
}
总结:
1,由上面递归可以推导出动态规划,动态规划只需要一维的数组就可以搞定
2,分析递归代码,当前位置的值依赖i+1和i+2 并且n的位置==1,退出动态规划数组由后往前填写
3,注意数字字符串的切片是uint8,转成int也是ascii,判断也必须是判断ascii相等



