当前位置: 面试刷题>> 解码方法 (经典算法题500道)


### 题目描述 给定一个只包含数字和非负整数范围内的字母的字符串,每个 `'A'` 到 `'Z'` 的字母可以表示从 `'1'` 到 `'26'` 的一个数字。现在,我们有一种方法来解码这个字符串,规则如下: - 字符串中的每个字符单独解码为一个数字(`1-9` 会被解码为 `1-9`,`0` 不可以单独解码)。 - 或者,字符串中的两个字符(必须是 `'10'` 到 `'26'`)可以被解码为一个数字。 问这个字符串有多少种不同的解码方法? ### 示例 **输入**: "12" **输出**: 2 **解释**: 它可以被解码为 "AB"(1 2)或者 "L"(12)。 **输入**: "226" **输出**: 3 **解释**: 它可以被解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。 **输入**: "0" **输出**: 0 **解释**: 没有字符可以被解码为 '0'。 ### PHP 代码示例 ```php function numDecodings($s) { $n = strlen($s); if ($n == 0 || $s[0] == '0') { return 0; } $dp = array_fill(0, $n, 0); $dp[0] = 1; for ($i = 1; $i < $n; $i++) { // 单个字符解码 if ($s[$i] != '0') { $dp[$i] += $dp[$i - 1]; } // 两个字符解码 $twoDigit = intval(substr($s, $i - 1, 2)); if ($twoDigit >= 10 && $twoDigit <= 26) { if ($i > 1) { $dp[$i] += $dp[$i - 2]; } else { $dp[$i] += 1; // 第一个字符和第二个字符组成的两位数 } } } return $dp[$n - 1]; } // 测试 echo numDecodings("12") . "\n"; // 输出 2 echo numDecodings("226") . "\n"; // 输出 3 echo numDecodings("0") . "\n"; // 输出 0 ``` ### Python 代码示例 ```python def num_decodings(s: str) -> int: n = len(s) if n == 0 or s[0] == '0': return 0 dp = [0] * n dp[0] = 1 for i in range(1, n): # 单个字符解码 if s[i] != '0': dp[i] += dp[i - 1] # 两个字符解码 two_digit = int(s[i-1:i+1]) if 10 <= two_digit <= 26: if i > 1: dp[i] += dp[i - 2] else: dp[i] += 1 return dp[-1] # 测试 print(num_decodings("12")) # 输出 2 print(num_decodings("226")) # 输出 3 print(num_decodings("0")) # 输出 0 ``` ### JavaScript 代码示例 ```javascript function numDecodings(s) { const n = s.length; if (n === 0 || s[0] === '0') { return 0; } const dp = new Array(n).fill(0); dp[0] = 1; for (let i = 1; i < n; i++) { // 单个字符解码 if (s[i] !== '0') { dp[i] += dp[i - 1]; } // 两个字符解码 const twoDigit = parseInt(s.substring(i - 1, i + 1)); if (twoDigit >= 10 && twoDigit <= 26) { if (i > 1) { dp[i] += dp[i - 2]; } else { dp[i] += 1; } } } return dp[n - 1]; } // 测试 console.log(numDecodings("12")); // 输出 2 console.log(numDecodings("226")); // 输出 3 console.log(numDecodings("0")); // 输出 0 ``` **码小课**网站中有更多相关内容分享给大家学习,包括算法题解、数据结构、编程技巧等,欢迎访问学习。
推荐面试题