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

题目:

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

 

示例 1:

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

 

提示:

  • 0 <= num < 231

代码:

 1 //采用回溯法,选择的是子集树+递归,因为存在1位或者2位转换,所有有两种可能性
 2 class Solution {
 3     static int count=0;
 4     static StringBuilder sb=null;
 5     public int translateNum(int num) {
 6         count=0;
 7         String s=String.valueOf(num);
 8         sb=new StringBuilder();   //这是为了统计所有的字符串,题目不要求可以不写,所有sb行都可删除
 9         fun(s,0);
10         return count;
11     }
12     
13     public void fun(String s,int t){
14         int len=s.length();
15         if(t>=len){
16          count++;
17         } else{
18             //第一种可能性,必然存在,无需判断
19               sb.append((char)((s.charAt(t)-'0')+97));
20               fun(s,t+1);
21               sb.deleteCharAt(sb.length()-1);
22               //第二种可能性,第一位不为0且两位小于26,也可以转换   
23               if(t<len-1&&s.charAt(t)!='0'){
24                   int i=s.charAt(t)-'0';
25                   int j=s.charAt(t+1)-'0';   //数值变字符,1+'0'即可,0的码值为48,也可1+48变成'1';
26                   if(i*10+j<26){
27                       sb.append((char)((i*10+j)+97));  //数值变字符,A的码值为65,a的码值为97;此处(i*10+j)+'a')也可以
28                       fun(s,t+2);  //已转换2位,所以t+2
29                       sb.deleteCharAt(sb.length()-1);
30                   }
31               }
32         }
33     }
34 }

 

posted @ 2021-04-08 16:27  堤苏白  阅读(48)  评论(0)    收藏  举报