剑指 Offer 46. 把数字翻译成字符串

 

思路:动态规划

  对于一个数字x1x2……xi,它的翻译方法 f( i ) 可以分为两种情况,xi-1和xi单独翻译和整体翻译。

  当xi-1和xi单独翻译时,f( i ) = f ( i - 1 ) + f( i - 2 )

  当xi-1和xi整体翻译时,f( i ) = f( i - 1 )

  设动态规划列表 dp ,dp[ i ] 代表以 xi 为结尾的数字的翻译方法数量。

  可推出当xi-1和xi满足组成数字在区间[10, 25]之间时,dp[ i ] = dp[ i - 1] + dp[ i - 2]

  其它区间dp[ i ] = dp[ i - 1 ].

  由此递推公式,遍历字符串来获取数字,代码如下:

时间复杂度O(n),空间复杂度O( n)

class Solution {
    public int translateNum(int num) {
        String str = String.valueOf(num);
        int[] dp = new int[str.length()];
        dp[0] = 1;
        for (int i = 1; i < str.length(); i++) {
            String tmp = str.substring(i-1, i+1);
            if (tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0) {
                if (i == 1){
                    dp[i] = 2;
                } else {
                    dp[i] = dp[i-1] + dp[i-2];
                }
            } else {
                dp[i] = dp[i-1];
            }
        }
        return dp[str.length()-1];
    }
}
posted @ 2021-02-28 05:02  zjcfrancis  阅读(49)  评论(0编辑  收藏  举报