【leetcode C++】 动态规划
4. 91 解码方法
题目:
一条包含字母
A-Z
的消息通过以下映射进行了 编码 :
"1" -> 'A'
"2" -> 'B'
...
"25" -> 'Y'
"26" -> 'Z'然而,在 解码 已编码的消息时,你意识到有许多不同的方式来解码,因为有些编码被包含在其它编码当中(
"2"
和"5"
与"25"
)。例如,
"11106"
可以映射为:
"AAJF"
,将消息分组为(1, 1, 10, 6)
"KJF"
,将消息分组为(11, 10, 6)
- 消息不能分组为
(1, 11, 06)
,因为"06"
不是一个合法编码(只有 "6" 是合法的)。注意,可能存在无法解码的字符串。
给你一个只含数字的 非空 字符串
s
,请计算并返回 解码 方法的 总数 。如果没有合法的方式解码整个字符串,返回0
。题目数据保证答案肯定是一个 32 位 的整数。
题目链接
91. 解码方法 - 力扣(LeetCode)
文字分析
代码
class Solution { public: int numDecodings(string s) { int n = s.size(); vector<int> dp(n); if(s[0] == '0') { return 0; } if(n == 1) { return 1; } if(s[0] == '0') { dp[0] = 0; } else { dp[0] = 1; } string x = s.substr(0,2); dp[1] = 0; if(s[0] != '0' && s[1] != '0') { dp[1]++; } if(stoi(x) <= 26) { dp[1]++; } for(int i = 2;i < n;i++) { x = s.substr(i - 1,2); if(s[i] == '0') { dp[i - 1] = 0; } if(stoi(x) > 26 ||stoi(x) < 10) { dp[i - 2] = 0; } dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n - 1]; } };
5. 62 不同路径
题目:
一个机器人位于一个
m x n
网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
题目链接
62. 不同路径 - 力扣(LeetCode)
文字分析
注意:
dp表实际大小是 (n + 1) * (m + 1)
代码
class Solution { public: int uniquePaths(int m, int n) { vector<int> s(n + 1); vector<vector<int>> dp(m + 1,s); dp[0][1] = 1; for(int i = 1 ;i < m + 1;i++) { for(int j = 1;j < n + 1;j++) { dp[i][j] = dp[i][j - 1] + dp[i - 1][j]; } } return dp[m][n]; } };
6. 63 不同路径2
题目:
一个机器人位于一个
m x n
网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用
1
和0
来表示。
题目链接
63. 不同路径 II - 力扣(LeetCode)
文字分析
与 5. 不同路径(62. 不同路径 - 力扣(LeetCode)) 的分析是一样的
唯一要注意的是,障碍位置的 dp值 为 0
代码
class Solution { public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { int n = obstacleGrid.size(); int m = obstacleGrid[0].size(); vector<vector<int>> dp(n + 1,vector<int>(m + 1)); dp[0][1] = 1; for(int i = 1;i < n + 1;i++) { for(int j = 1;j < m + 1;j++) { if(obstacleGrid[i - 1][j - 1] == 1) { dp[i][j] = 0; } else { dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } } } return dp[n][m]; } };