Leetcode91:解码方法

题目描述

在这里插入图片描述

思路分析1

在这里插入图片描述

代码实现1

public static int numDecodings1(String s) {
		if (s.charAt(0) == '0') {
			return 0;
		}
		int pre = 1, curr = 1;// dp[-1]=dp[0]=1
		for (int i = 1; i < s.length(); i++) {
			int temp = curr;
			if (s.charAt(i) == '0') {
				if (s.charAt(i - 1) == '1' || s.charAt(i - 1) == '2') {
					curr = pre;
				} else {
					break;
				}
			} else if (s.charAt(i - 1) == '1' || s.charAt(i - 1) == '2' && s.charAt(i) >= '1' && s.charAt(i) <= '6') {
				curr = curr + pre;

			}
			pre = temp;
		}
		return curr;
	}

思路分析2

首先,如果第一位上是0,那么无法转码,返回0;
其次,每次转码,都可以看看第i位跟第i-1位的数字是否小于等于26,如果符合的话,我们在i-2位上解码;如果第i位不等于0的话,说明我们相当于在第i-1位上解码。如果两个都符合,相当于:dp[i] = dp[i-1] + dp[i-2];

代码实现2

	public static int numDecodings(String s) {
		if (s == null || s.length() == 0) {
			return 0;
		}
		int len = s.length();
		int[] dp = new int[len + 1];
		dp[0] = 1;
		dp[1] = s.charAt(0) != '0' ? 1 : 0;
		for (int i = 2; i <= len; i++) {
			int first = Integer.valueOf(s.substring(i - 1, i));
			int second = Integer.valueOf(s.substring(i - 2, i));
			if (first >= 1 && first <= 9) {
				dp[i] += dp[i - 1];
			}
			if (second >= 10 && second <= 26) {
				dp[i] += dp[i - 2];
			}
		}
		return dp[len];
	}
发布了88 篇原创文章 · 获赞 27 · 访问量 5908

猜你喜欢

转载自blog.csdn.net/weixin_43362002/article/details/104501216