3 动态规划解解码问题

来源:LeetCode第91题

难度:中等

描述:一条包含字母A-Z的消息通过以下映射进行了编码:
'A'->1,'B'->2,'z'->26,要接吗已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能由多种方法),例如"11106"可以映射成'AAJF',将消息分组为(1 1 10 6),注意,消息不能分组为(1 11 06)因为06不能映射成F,这是因为'6'和'06'在映射中并不等价。
示例1:
输入:s="12";
输出:2
解释:他可以解码为"AB"(1 2)或者"L"(12);

第一种求解方法:递归

//定义一个递归函数,String s表述输入的字符串,index表示开始进行判断的索引
public int numDecode(String s,int index)
{
//当索引大于s.length()的时候,表明已经找到了一个路径返回1,这是作为递归的终止条件
 if(index>=s.length())
return 1;

int res=0;
if(s.charAt(index)!='0')
{
//这个判断标准表明s.chaeAt(index)可以作为单独的一个字母,从而可继续向下走
res+=numDecode(s,index+1);
}
//以'1'开头或以2开头且第二个字母小于6(26),两者均要满足下一个字母存在
if(((index+1)<=s.length()-1)&&(s.charAt(index)=='1'||(s.charAt(index)=='2'&&s.charAt(index+1)<='6')))
{
res+=numDecode(s,index+2);
}
map[index]=res;
return res;
}

在进行递归操作的时候,很多情况下会出现重复计算,从而可以使用一个map实现计算过得值的一个存储,从而使得不用进行重复计算,
 

public int numDecode(String s,int index,int []map)
{
if(index>=s.length())
return 1;
int res=0;
if(map[index]!=-1)
{
return res+map[index];
}
if(s.charAt(index)!='0')
{
res+=numDecode(s,index+1,map);
}
if((index+1<=s.length()-1)&&((s.charAt(index)=='1')||(s.charAt(index)=='2'||(s.charAt(index+1)<='6'))))
{
res+=numDecode(s,Index+2,map);
}
}
public void NumDecode(String s)
{
int []map=new int [s.length()];
numDecode(s,0,map);
}

动态规划求解,除此之外,还可以使用动态规划进行求解,每一次可以走一步也可以走两步
 


public int numDecode3(String s,int index)
{
int dp[]=new int[s.length()];
if(s.charAt(0)=='0')
{
dp[0]=0
}else
{
dp[0]=1;
}
for(int i=1;i=2)
{
if((i+1<=s.length()-1)&&((s.charAt(i)=='1')||(s.charAt(i)=='2'&&s.charAt(i+1)<='6')))
{
dp[i]+=dp[i-2];
}
}
}
return dp[s.length()-1]
}

你可能感兴趣的:(JAVA刷题500道,动态规划,算法,java)