随笔记录
算法-数字字符转化为字母字符种数
2022-4-22 diaba
package com.jiucaiyuan.net.question;

/**
* 【问题】规定1和A对应,2和B对应,3和C对应...
* 那么一个数字字符串,比如"111",可以转化为"AAA","KA","AK"
* 给定一个只有数字字符组成的字符串str,返回有多少种转化结果
*
* @Author jiucaiyuan 2022/4/22 23:02
* @mail services@jiucaiyuan.net
*/
public class ConvertNum2Letters {
public static int number(String str) {
if (str == null) {
return 0;
}
return process(str.toCharArray(), 0);
}

/**
* i之前(0~i-1)位置已经分析过,当前方法分析i位置及以后
*
* @param chs 给定的数字字符串
* @param i 当前i位置及以后有多少种
* @return 返回转化种数
*/
public static int process(char[] chs, int i) {
if (i == chs.length) {
return 1;
}
//当前位置为0,无法对应到什么字符,说明之前的安排是不可取的,返回0种
if (chs[i] == '0') {
return 0;
}

if (chs[i] == '1') {
//尝试i自己转化为一个字符,后面有多少种
int res = process(chs, i + 1);
//如果i+1后还存在字符,尝试i和i+1组合转化,后面有多少种
if (i + 1 < chs.length) {
res += process(chs, i + 2);
}
return res;
}
if (chs[i] == '2') {
//尝试i自己转化为一个字符,后面有多少种
int res = process(chs, i + 1);
//如果i和i+1一起组合,并且没有超过26,后面有多少种
if (i + 1 < chs.length && chs[i + 1] >= '0' && chs[i + 1] <= '6') {
res += process(chs, i + 2);
}
return res;
}
//如果当前字符是3~9,只能i自己进行转化,后面是i+1及以后有多少种
return process(chs, i + 1);
}

public static void main(String[] args) {
System.out.println(number("111"));
}
}
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容