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]);
}
}
};