【一周编程学习】--6.递归LeetCode第17题、46题

1.LeetCode第17题

题目:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

解题思路:这是一个字母排列问题,先将输入的数字替换成对应的字母。从输入数字的第一个数字开始,将每一种可能的结果添加到结果中,递归终止的条件是当组合字母的索引等于输入数字的长度时。

findCombination(digits,0,"");  为什么传入的参数为0

使用C++和Python实现:

class Solution{
private:
	vector<string> res;
	const string letterMap[10]{
	"",
	"",
	"abc",
	"def",
	"ghi",
	"jkl",
	"mno",
	"pqrs",
	"tuv",
	"wxyz"
	};
	void findCombination(const string& digits,int index,const string&s)
	{
		if(index==digits.size()){
			res.push_back(s);
			return;
            }
	char c=digits[index];//获取字符串中的指定数子
	string letters=letterMap[c-'0'];
	//遍历数组的可能性,进行递归操作
	for(int i=0;i<letters.size();i++)
		findCombination(digits,index+1,s+letters[i]);
    }
public:
	vector<string> letterCombinations(string digits)
	{
		res.clear();
		if(digits=="")
			return res;
		findCombination(digits,0,"");
		return res;
	}	
};
class Solution(object):
    def letterCombinations(self, digits, pos=0):
        """
        :type digits: str
        :rtype: List[str]
        """
        if digits == "":
            return []
        
        d = {"0":[" "], "1":["/"], "2":["a","b","c"], "3":["d","e","f"], "4":["g","h","i"], "5":["j","k","l"], "6":["m","n","o"],
             "7":["p","q","r","s"], "8":["t","u","v"], "9":["w","x","y","z"]}
        
        if pos == len(digits):
            return [""]
        
        r = self.letterCombinations(digits, pos+1)
        y = []
        for i in d[digits[pos]]:
            for j in r:
                x = i + j
                y.append(x)
        return y
            

 


2.LeetCode第46题

当题目给出一个字符串string时,要求用一个数组形式输出它的全排列,不允许有重复情况 。这其实是一个回溯问题,因为我们正在放置一个项目,然后从那里探索所有的可能性。当我们遇到“生成”、“计算”问题时,它就是一种包含更大更大可能性的几个决策点的表示。

class Solution {
public:
    vector<vector<int> > permute(vector<int> &num) {
	    vector<vector<int> > result;
	    
	    permuteRecursive(num, 0, result);
	    return result;
    }
    
	void permuteRecursive(vector<int> &num, int begin, vector<vector<int> > &result)	{
		if (begin >= num.size()) {
		    // one permutation instance
		    result.push_back(num);
		    return;
		}
		
		for (int i = begin; i < num.size(); i++) {
		    swap(num[begin], num[i]);
		    permuteRecursive(num, begin + 1, result);
		    swap(num[begin], num[i]);
		}
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值