leetcode-17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
答案可以按 任意顺序返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
思路:
不断把前面的元素拿出来追加,然后再删除之前的元素
class Solution {
public:
vector<vector<string>> v = {{},{},{"a","b","c"},{"d","e","f"},
{"g","h","i"},{"j","k","l"},
{"m","n","o"},{"p","q","r","s"},
{"t","u","v"},{"w","x","y","z"}};
vector<string> letterCombinations(string digits) {
vector<string> ret;
int digitsLen = digits.length();
if (digitsLen <= 0)
return ret;
for (int i = 0; i < digitsLen; i++) {
if ((digits[i] - '0') > 9 || (digits[i] - '0') < 2)
continue;
int count = v[digits[i] - '0'].size();
int len = ret.size();
for (int j = 0; j < count; j++) {
if (len <= 0) {
ret.push_back(v[digits[i] - '0'][j]);
} else {
for (int k = 0; k < len; k++) {
ret.push_back(ret[k] + v[digits[i] - '0'][j]);
}
}
}
if (len > 0)
ret.erase(ret.begin(), ret.begin() + len);
}
return ret;
}
};
【附录】
- vector的范围删除
ret.erase(ret.begin(), ret.begin() + len)
如下方式删除则一直报错:
vit = ret.end() - 1;
ret.erase(ret.begin(), vit + 1);
可实验:
#include <vector>
#include <iostream>
using namespace std;
void printV(vector<int>& v) {
for (int i = 0; i < v.size(); i++) {
cout << v[i] << ",";
}
cout << endl;
}
int main()
{
vector<int> v = {1,2,3,4};
vector<int>::iterator vit = v.end() - 1;
printV(v);
v.push_back(5);
cout << "vit " << *vit << endl; // 打印为 NULL
v.erase(v.begin(), vit + 1); // 不能这么搞,让vit重新指向5不可能了
printV(v); // 打印无止境了
return 0;
}