回溯问题:LeetCode #91 #72
1
编程题
【LeetCode #91】解码方法
一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 … 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12" 输出: 2 解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。 示例 2: 输入: "226" 输出: 3 解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
解题思路:
假设dp[i]表示前i-1个数字所解码的字符串数量,因此对于i来说,且dp长度为s.length()+1,其有两种编码方式:
我们只需要判断这两个条件,如果成立了,就加上相应的结果即可!
class Solution {
public:
int numDecodings(string s) {
if (s[] == '0') return ;
vector<int> dp(s.length() + );
dp[] = dp[] = ;
for(int i = ; i <= s.length(); i++){
if(s[i-1] != '0'){
dp[i] += dp[i-1];
}
if((s[i-2] == '1') || (s[i-2] == '2' && s[i-1] <= '6')){
dp[i] += dp[i-2];
}
}
return dp[s.length()];
}
};
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/decode-ways
【LeetCode #72】编辑距离
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1:
输入: word1 = "horse", word2 = "ros" 输出: 3 解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e')
解题思路:
利用动态规划的思想,我们可以得到以下几个递推式: 在DP矩阵初始化时,dp[i][j]表示source[0:i]编辑成result[0:j]所需要的最小编辑距离,因此当i=0或者j=0,则需要最小编辑距离为非零长度字符串的长度(依次插入或删除)。
综上所述,其状态方程可以总结为两个: 当word1[i] == word2[j],则dp[i][j] = dp[i-1][j-1], 即没有操作 当word1[i] != word2[j],则dp[i][j] = 1 + min(cost[i-1][j-1], min(cost[i][j-1], cost[i-1][j])),每步最小的操作数+1。
class Solution {
public:
int minDistance(string word1, string word2) {
int m = word1.length();
int n = word2.length();
vector<vector<int>> cost(m+, vector<int>(n+));
for(int i = ; i <= m; ++i){
cost[i][] = i;
}
for (int j = ; j <= n; ++j) {
cost[][j] = j;
}
for (int i = ; i <= m; ++i) {
for (int j = ; j <= n; ++j) {
if (word1[i-1] == word2[j-1]) {
cost[i][j] = cost[i-1][j-1];
} else {
cost[i][j] = + min(cost[i-1][j-1], min(cost[i][j-1], cost[i-1][j]));
}
}
}
return cost[m][n];
}
};
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/edit-distance