Leetcode17. Letter Combinations of a Phone Number
写在前头:本人C++功底比较差,拿leetcode练C++,大佬莫笑。
输入2-9,返回所有可能的字符串


递归和迭代
这个题里面,迭代就像树的层次遍历,一行一行的出,出一个,把它子节点全push进来,直到最后一行为止全是子节点,ok了
先找[“a”“b”“c”]
递归的思想类似深度遍历,一直往下找到子节点才开始出。递归方法还没写,后面补充。
先找[“ad”]
迭代
代码.
// Iterative
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> res;
if (digits.size()==0)
return res;
string dict[]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
res.push_back("");
int x=digits.size(),y;
for(int i=0;i<x;i++)
{
int n=res.size(); //这里要注意!!!!!!
string m=dict[digits[i]-'2'];
for(int j=0;j<n;j++)
{
string a=res.front();
res.erase(res.begin());
for(int k=0;k<m.size();k++)
{
res.push_back(a+m[k]);
}
}
}
return res;
}
};
string dict[]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
大概作用类似哈希表,字典?但是要注意 数字string 2 对应 dict[0],这个数别搞错。
int n=res.size();
...
for(int j=0;j<n;j++)
这个东西很关键,不然时间就超了,要如果直接循环条件写成res.size(),
就要算很多次(因为循环次数挺多的到后面)。
res.erase()删除,这个位置可以是下标,也能是指针。
res.erase(10);从pos=10开始后面全删完。
res.erase(6,4);从pos=6开始后面删4个。
res.erase(res.begin()+10) 删除第11个元素。
res.erase(res.begin()+10,res.end()) 从第11个元素开始删到结束,删除集合--左闭右开[ , )。
另一种删除是res.pop_back(),跟push_back()很像都是back,对尾部操作,删最后一个,这个有点蠢。
res.begin()返回首个元素的指针;
res.end()返回的是最后一个元素+1的指针,正好和上面左闭右开一样蠢的刚刚好。
res.front()返回的是首个元素,和res[0]是一个效果有没有?能再蠢一点吗?
迭代
还没写呢,准备去洗澡,回来写完也不一定贴,嗯,就这样。
本文详细解析了LeetCode上的经典题目Letter Combinations of a Phone Number,并提供了迭代方法的C++代码实现,通过层次遍历的方式解决电话号码对应的字母组合问题。
5885

被折叠的 条评论
为什么被折叠?



