LeetCode 91. 解码方法
题目描述
✅ 91. 解码方法
思路分析
解法一:动态规划(推荐)
核心思路:
dp[i]表示前 i 个字符的解码方法数。- 若
s[i-1]不为 0,则dp[i] += dp[i-1]。- 若
s[i-2..i-1]在 10~26 之间,则dp[i] += dp[i-2]。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示字符串长度。
- 空间复杂度:O(1),只需常数变量滚动。
class Solution {
public int numDecodings(String s) {
if (s == null || s.length() == 0 || s.charAt(0) == '0') {
return 0;
}
int prev2 = 1;
int prev1 = 1;
for (int i = 2; i <= s.length(); i++) {
int cur = 0;
char c1 = s.charAt(i - 1);
char c0 = s.charAt(i - 2);
if (c1 != '0') {
cur += prev1;
}
int val = (c0 - '0') * 10 + (c1 - '0');
if (val >= 10 && val <= 26) {
cur += prev2;
}
prev2 = prev1;
prev1 = cur;
}
return prev1;
}
}
func numDecodings(s string) int {
if len(s) == 0 || s[0] == '0' {
return 0
}
prev2 := 1
prev1 := 1
for i := 2; i <= len(s); i++ {
cur := 0
c1 := s[i-1]
c0 := s[i-2]
if c1 != '0' {
cur += prev1
}
val := int(c0-'0')*10 + int(c1-'0')
if val >= 10 && val <= 26 {
cur += prev2
}
prev2 = prev1
prev1 = cur
}
return prev1
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 70. 爬楼梯 | 简单 | 动态规划 |
| 91. 解码方法 | 中等 | 动态规划 |
| 639. 解码方法 II | 困难 | 动态规划 |
| 322. 零钱兑换 | 中等 | 动态规划 |
| 198. 打家劫舍 | 中等 | 动态规划 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!