【发布时间】:2017-08-28 14:48:58
【问题描述】:
我正在解决下面的 LeetCode 问题:
给定一个数字字符串,返回该数字可以表示的所有可能的字母组合。下面给出了数字到字母的映射(就像电话按钮上一样)。
我试图了解高度赞成的解决方案的复杂性:
class Solution {
public:
vector<string> letterCombinations(string digits) {
std::vector< string > vec;
if(digits.length()==0)
return vec;
std::queue< std::string > ans;
std::string mapping[]={"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
ans.push("");
for(int i=0; i<digits.length(); i++)
{
int x = (digits[i]-'0');
while(ans.front().length()==i)
{
std::string t=ans.front();
ans.pop();
for(int j=0; j<mapping[x].length(); j++)
{
ans.push(t+mapping[x][j]);
//cout<<t+mapping[x][j]<<"\n";
}
}
}
std::string val;
int size=ans.size();
for(int i=0; i<size; i++)
{
val=ans.front();
ans.pop();
vec.push_back(val);
}
return vec;
}
};
我的理解如下:
如果n 是位数,那么我认为复杂度是O(k*n^2),其中k 是映射长度(2 -> 'abc',3 -> 'def' 等等) .
最外层的for循环执行n次。在每次迭代中,我们访问队列中长度等于i(最坏情况下为n)的前面元素。这使它成为O(n^2)。最里面的 for 循环运行固定次数(等于映射长度,比如k)。此外,push() 操作需要固定时间。因此,总复杂度为O(k*n^2)。
我的理解正确吗?
【问题讨论】:
-
评论还不够——字符串
5^n(n连续出现5的实例,例如5、55、555、. ..) 表示3^n字符串,因为每个数字都可以对应三个字母中的任何一个。实际上,最坏的情况是长度为n的字符串9s 和7s,给出4^n的可能性。如果您返回4^n字符串(实际字符串,而不仅仅是此类字符串的数量),我认为比指数时间做得更好是不现实的。如果您要返回某种压缩表示形式(例如数字字符串本身!)或元数据(字符串数量),那就不同了。 -
@Patrick87,您能详细说明一下吗?
-
O(k^n) 是我想出的。
-
@iBug,怎么会这样?你能详细说明一下吗?
标签: c++ algorithm time-complexity