Arrays 检查电话数字中单词集合的最快算法

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

例如,我有一个数组['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' : 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)个时间内进行每次查找。