思路:
一道经典的动态规划dp,判断前2个数是否满足>=10&&<=25,若满足,则有2种翻译方法,并且还要加上前面的所有情况
方法一:dp
方法二:用字母代替dp
代码:
方法一:
class Solution {
public int translateNum(int num) {
String s=String.valueOf(num);
//要比s的长度+1
int[] dp=new int[s.length()+1];
dp[0]=1;
dp[1]=1;
for(int i=2;i<=s.length();i++){
String temp=s.substring(i-2,i);
if(temp.compareTo("10")>=0&&temp.compareTo("25")<=0){
dp[i]=dp[i-2]+dp[i-1];
}
else{
dp[i]=dp[i-1];
}
}
//例如:s[4]就是dp[5]
return dp[s.length()];
}
}
方法二:
class Solution {
public int translateNum(int num) {
String s=String.valueOf(num);
int a=1,b=1;
for(int i=2;i<=s.length();i++){
//前闭后开
String temp=s.substring(i-2,i);
int c=temp.compareTo("10")>=0&&temp.compareTo("25")<=0?a+b:a;
b=a;
a=c;
}
return a;
}
}
分解:
1)初始化时,空数字0和数字1的翻译方法都只有一种
2)s[i]相对于dp[i+1],所以创建dp时,长度为s的长度+1
如果前2个数满足>=10&&<=25,则有2种翻译方法,相当于dp[i-1]+dp[i-2]
如果不满足,则只有一种,相当于dp[i-1]
3)最后返回dp[s.length()]即可,而不是dp[s.length()-1]
4)dp变字母:
dp[i-1]代表a,dp[i-2]代表b
每一轮:c=a+b或a,b=a,a=c
最后返回a
复杂度分析:
时间复杂度:O(N) N个元素就要循环N此
空间复杂度:O(N) dp数组和字符串s都需要O(N)的额外空间