Arrays 检查电话数字中单词集合的最快算法
例如,我有一个数组['bab','col','stro']Arrays 检查电话数字中单词集合的最快算法,arrays,algorithm,data-structures,time-complexity,big-o,Arrays,Algorithm,Data Structures,Time Complexity,Big O,例如,我有一个数组['bab','col','stro'] IN OUT 222 bab 7876 stro 999 <empty> no match 输入输出 222巴布 7876斯特罗 999没有对手 有什么算法能比O(n^2)更好地解决这个问题吗?将列表预处理为翻译表,每个单词都键入其数字对应项。这使您可以轻松地查找搜索 dial_num = [ 'a' : 2, 'b' : 2, 'c' : 2. 'd
IN OUT
222 bab
7876 stro
999 <empty> no match
输入输出
222巴布
7876斯特罗
999没有对手
有什么算法能比O(n^2)更好地解决这个问题吗?将列表预处理为翻译表,每个单词都键入其数字对应项。这使您可以轻松地查找搜索
dial_num = [
'a' : 2,
'b' : 2,
'c' : 2.
'd' : 3,
...
]
接下来,翻译每个单词:
dial_word = [
222 : 'bab',
264 : 'col',
7876 : 'stro'
...
]
该任务是O(N)以字符为单位的数组长度。
现在,您可以对给定的数字进行简单的搜索(线性或对数)。如果您想进一步预处理dial_word
作为哈希表,您将有O(1)查找。使用std::vector words
表示输入
std::vector<std::string> S;
// First convert strings to (string)numbers.
for(auto word in words){
std::string s;
for(auto c in word)
switch (c)
{
case 'a':case 'b': case 'c'
s += '1'; break;
case 'd':case 'e': case 'f'
s += '2'; break;
...
}
S.push_back(s);
}
// Now S has corresponding numbers for each string
std::string input;
std::cin >> input;
// Find the number string match on a given input. You can do iteratively search here to find all.
if (S.find(input) == S.end())
std::cout << "Does not exist" << endl;
else
std::cout << words[S.find(input) - S.begin()] << endl;
std::向量S;
//首先将字符串转换为(字符串)数字。
for(文字中的自动字){
std::字符串s;
for(word中的自动c)
开关(c)
{
案例“a”:案例“b”:案例“c”
s+='1';中断;
案例“d”:案例“e”:案例“f”
s+='2';中断;
...
}
S.向后推;
}
//现在S的每个字符串都有相应的数字
std::字符串输入;
std::cin>>输入;
//查找与给定输入匹配的数字字符串。您可以在此处进行迭代搜索以查找所有。
如果(S.find(输入)=S.end())
std::cout我认为应该使用TRIE数据结构来实现(每个电话名和号码条目都是一个叶子)。TRIE是一种使用字符串作为键的有序树数据结构。
检查此项如何翻译每个单词,如何比较?您可以从拨号表中获得它,您必须自己创建它。@mysteryfollow:如何翻译和如何比较是语言相关的实现细节,而不是算法的一部分;该算法是您的问题。请注意,在多个字符串转换为同一个数字的情况下,dial_单词可能不是映射。在这种情况下,更好的方法是使用链表;或者从我答案中的代码中进行迭代搜索。@Vince:是的,在这种情况下,OP需要将单词构建成一个兼容单词的数组。因为这不是文章的一部分,我没有用那个细节来复杂化我的答案。我不知道你所说的“检查”是什么意思。你是在寻找一个与数字相关的名字,还是其他方式?在这两种情况下,您都可以使用一个映射(HashMap),它应该允许您在大约O(1)个时间内进行每次查找。