暴力递归——数字字符转化

//规定1和A对应、2和B对应、3和C对应... 那么一个数字字符串比如"111",就可以转化为"AAA"、"KA"和"AK"。
//给定一个只有数字字符组成的字符串str,返回有多少种转化结果。

//特殊情况1:如果存在0的位数,0是不能单独转换的,只有10和20的情况
//特殊情况2:如果存在某位3-9的范围中,那么也单独转换,因为不存在大于26的组合位数
public class ConvertToLetterString {

	public static int number(String str) {
		if (str == null || str.length() == 0) {
			return 0;
		}
		return process(str.toCharArray(), 0);
	}

	public static int process(char[] chs, int i) {
		//如果i已经抵达最后位置,那么仅返回一种有效结果
		if (i == chs.length) {
			return 1;
		}
		//如果存在0,由于之前的分配方法存在错误,所以返回0
		if (chs[i] == '0') {
			return 0;
		}
		//如果某位上为1,res从i+1上持续递归
		if (chs[i] == '1') {
			int res = process(chs, i + 1);
			//如果i+1没有越界,res尝试并累加i+2上的数据
			if (i + 1 < chs.length) {
				res += process(chs, i + 2);
			}
			return res;
		}
		//如果某位上为2,res从i+1上持续递归
		if (chs[i] == '2') {
			int res = process(chs, i + 1);
			//但仅有在i+1没有越界时,
			if (i + 1 < chs.length && (chs[i + 1] >= '0' && chs[i + 1] <= '6')) {
				res += process(chs, i + 2);
			}
			return res;
		}
		return process(chs, i + 1);
	}

	public static void main(String[] args) {
		System.out.println(number("11111"));
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值