LeetCode刷题--点滴记录020
Posted 鲁棒最小二乘支持向量机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode刷题--点滴记录020相关的知识,希望对你有一定的参考价值。
20. 剑指 Offer 46. 把数字翻译成字符串
要求
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
思路
动态规划:
- 状态定义: 设动态规划列表 dp ,dp[i] 代表以 xi为结尾的数字的翻译方案数量
- 转移方程: 若 xi和 x i−1组成的两位数字可被整体翻译,则 dp[i] = dp[i - 1] + dp[i - 2] ,否则 dp[i] = dp[i - 1] 。可被整体翻译的两位数区间是[10,25]
- 初始状态: dp[0] = dp[1] = 1 ,即 “无数字” 和 “第 1 位数字” 的翻译方法数量均为1。当 num 第 1, 2 位的组成的数字∈[10,25] 时,显然应有 2种翻译方法,即 dp[2] = dp[1] + dp[0] = 2 ,而显然 dp[1]=1 ,因此推出 dp[0]=1
- 返回值: dp[n],即此数字的翻译方案数量
解题
#include <iostream>
using namespace std;
#include <vector>
#include <string>
class Solution
public:
int translateNum(int num)
string s = to_string(num);
vector<int> dp(s.size()+1, 0); // dp[0] 是空串
dp[0] = dp[1] = 1; // dp[1]是长度为1的字符串
for (int i = 2; i < s.size()+1; i++)
string tmp = s.substr(i - 2, 2); //字符串切片
if (tmp.compare("10") >= 0 && tmp.compare("25") <= 0)
dp[i] = dp[i - 1] + dp[i - 2];
else dp[i] = dp[i - 1];
return dp[s.size()];
;
void test01()
Solution solution;
int num = 12258;
cout << solution.translateNum(num) << endl;
int main()
test01();
system("pause");
return 0;
希望本文对大家有帮助,上文若有不妥之处,欢迎指正
分享决定高度,学习拉开差距
以上是关于LeetCode刷题--点滴记录020的主要内容,如果未能解决你的问题,请参考以下文章