剑指Offer面试题46:把数组排成最小的数(从下往上解决递归子问题)

这道题,我一开始的想法是,递归,但是涉及到排列组合的时候,觉得怎么也想不出一个很好的办法。即使是有了答案的公式之后,想要直接排列组合得到结果还是不容易。

后来看了答案,答案给出公式

f(i) = f(i+1) + g(i,i+1)*f(i+2),其中f(i)表示以数字i为开头的种类个数,g表示,若i和i+1可以组合成小于26的数,则为1,否则为0.这样的递归,是可以计算出所有的情况的,但是会有重复子问题。因此,从右向左翻译并计算不同翻译的数目,自下而上解决问题。

在从下往上的时候,先计算最后一个,因为之前的计算要依靠靠后元素的计算结果,因此一个保存结果的数组就可以实现从下往上

答案代码

    public int translateNum(int num) {
        String num_s = num + "";
        char[] num_c = num_s.toCharArray();
        int[] time_num = new int[num_c.length];
        for(int count = num_c.length -1;count>=0;count--){
            if(count == num_c.length -1){
                time_num[count] = 1;

            }else{
                time_num[count] = time_num[count+1];
            }
            if(count + 1 <num_c.length){
                int dig1 = num_c[count] - '0';
                int dig2 = num_c[count+1] - '0';

                if(dig1*10 + dig2 <=25 && dig1*10 + dig2 >= 10){
                    if(count < num_c.length - 2){
                        time_num[count] += time_num[count + 2];
                    }else{
                        time_num[count] += 1;
                    }
                    
                }
            }


        }
        return time_num[0];
    }

猜你喜欢

转载自blog.csdn.net/qq_40473204/article/details/114576706