题解 | #把数字翻译成字符串#
把数字翻译成字符串
https://www.nowcoder.com/practice/046a55e6cd274cffb88fc32dba695668?tpId=295&tqId=1024831&ru=%2Fpractice%2F7d21b6be4c6b429bb92d219341c4f8bb&qru=%2Fta%2Fformat-top101%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295
考虑边界条件(鲁棒性)
class Solution {
public:
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
int solve(string nums) {
// dp[i] 表示长度为 i 的字符串有 多少种可能译码结果
if (nums.empty() || nums[0] == '0') {
return 0;
}
int size = nums.size();
for (int i = 1; i < size; ++i) {
if (nums[i] == '0') {
if (nums[i - 1] != '1' && nums[i - 1] != '2') {
return 0;
}
}
}
std::vector<int> dp(nums.size() + 1, 1);
// 两种译码可能才状态转移,一种情况下不变其数量(以前一位作为当前量)
for (int i = 1; i < size; ++i) {
if ((nums[i] != '0' && nums[i - 1] == '1') || (nums[i] > '0' && nums[i] < '7' && nums[i - 1] == '2')) {
dp[i + 1] = dp[i] + dp[i - 1];
} else {
dp[i + 1] = dp[i];
}
}
return dp[size];
}
};