//数字字符串转换为字母组合的种数
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));
}
}