题解 | #把数字翻译成字符串#

把数字翻译成字符串

https://www.nowcoder.com/practice/046a55e6cd274cffb88fc32dba695668

import java.util.*;


public class Solution {
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
     /**
        思路:  '1'    有a            1种情况
                '11'  有aa和l         2种情况
                '111' 有aaa和al和la    3种情况
                '1111' 有aaaa和laa和ala和aal和ll 5种情况
                .......
                由上可知
                1.如果当前字符是可以与前一个字符组合的
                那么 f(n) = f(n-1) + f(n-2);
                即 要么把当前字符加入其中就相当于在字符串末尾多家了一个字符 f(n) = f(n-1)
                要么把当前加入字符的前一个字符拿过来和当前字符组成一个新的字符加入末尾
                f(n) = f(n-2);

                2.如果当前字符不可以与前一个字符组合的
                f(n) = f(n-1);
                将该字符加入字符串末尾 不会对原情况数造成任何影响


        当然 也要排除一些不可能的情况        
      */
    public int solve (String nums) {
        // write code here
        //当输入为"0"时
        if(nums.equals("0")) return 0;

        //当出现10 和 20 时 只有一种情况
        if(nums.equals("10") || nums.equals("20")) return 1;

        //如果0的前面不是1 或 2 则译码出错误

       for(int i = 1; i < nums.length(); i++){ 
            if(nums.charAt(i) == '0')
                if(nums.charAt(i - 1) != '1' && nums.charAt(i - 1) != '2')
                    return 0;
        }


        int []dp = new int[nums.length()+1];

        dp[0]=1;
        dp[1]=1;
        for(int i = 2 ; i <=nums.length() ; i++){
            if( (nums.charAt(i-2)=='1'&& nums.charAt(i-1)!='0' )|| (nums.charAt(i-2)=='2' && nums.charAt(i-1)<'7' && nums.charAt(i-1)!='0')){
                dp[i] = dp[i-1] + dp[i-2];
            }else{
                dp[i] = dp[i-1];
            }
        }

        return dp[nums.length()] ;
    }
}

全部评论
问一句啊,这个解法的时间复杂度是多少?
点赞 回复 分享
发布于 2023-05-30 09:06 广东
感谢大佬,解释的很到位
点赞 回复 分享
发布于 2023-05-30 09:27 湖南

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务