第三章 递归与回溯(上)
一、递归
leetcode91. 解码方法
一条包含字母 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) 。
将字符串转化为字符数组,利用递归函数从最后一个字母开始不断向前递归,在递归函数中,为了避免无限循环导致堆栈溢出,应该判断什么时候退出,从后往前只有一个字母时,只有一种解法,返回1。然后我们考虑当前字符和前一个字符,注意第一个字符不能为0,如果为0,则无法匹配。
class Solution {
public:
int numDecodings(string s) {
char chars[s.length()];
for(int i=0;i<s.length();i++){
chars[i] = s[i];
}
return decode(chars,s.length()-1);
}
int decode(char* chars,int index){
if (chars[0] == '0') return 0;
if(index<=0){
return 1;
}
int count = 0;
int cur = chars[index];
int prev = chars[index -1];
if(cur>'0'){
count += decode(chars,index-1);
}
if(prev=='1' || (prev=='2' && cur<='6') ){
count += decode(chars,index-2);
}
return count;
}
};
此题还可以用自底向上的动态规划解。
递归写法结构总结:
leetcode247 中心对称数
注意00并不是合法结果
n>=3时,不断在两边添加中心对称数即可。
各种递归算法解决时间复杂度分析
迭代法
公式法