数字字符串转换为字母组合的种数


//数字字符串转换为字母组合的种数
public class NumToAlphabet{
	//暴力递归的方法(时间复杂度O(2^n),空间复杂度O(n))
	public static int num01(String str)
	{
		if(str==null||str.equals(""))
		{
			return  0;
		}
		//字符串转换为数组
        char[]ch=str.toCharArray();
        
        return process(ch,0);

	}
	//递归函数(i表示已经处理了的字符串数目)
	public static int process(char[]ch,int i)
    {
    	if(i==ch.length)
    	{
    		return 1;
    	}
    	if(ch[i]=='0')
    	{
    		return 0;
    	}
    	int res=process(ch,i+1);
           
        if(i+1<ch.length&&(ch[i]-'0')*10+ch[i+1]-'0'<27)
        {
        	res+=process(ch,i+2);
        }

    	return res;
        
    }

     //斐波那契法
    public static int num02(String str)
    {
         if(str==null||str.equals(""))
         {
         	return 0;
         }
         //字符串转换成数组
         char[]ch=str.toCharArray();
         int cur=ch[ch.length-1]=='0'?0:1;
         int next=1;
         int temp=0; //用于交换数据
         for(int i=ch.length-2;i>=0;i--)
         {
         	if(ch[i]=='0')
         	{
         		next=cur;
         		cur=0;
         	}else
         	{
         		 temp=cur;
         		 if(i+1<ch.length&&(ch[i]-'0')*10+ch[i+1]-'0'<27)
         		 {
         		 	cur+=next;
         		 }
         		 next=temp;

         	}

         }
         return cur;

    }


	public static void main(String[]args)
	{
		String str="1111";
		//方法一
		System.out.println(num01(str));
        //方法二
        System.out.println(num02(str));
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值