不完全输入的搜索算法

时间:2013-05-10 05:11:07

标签: arrays string search

我需要一个算法来搜索数组中的字符串,但字符串可能与数组中的某个项目不完全相同。 例如,

Array = {"Stack", "Over", "Flow", "Stake"}
input = "Sta"

需要识别Stack和Stake都匹配参数,然后选择按字母顺序排在第一位的参数。 我怎么能这样做?

5 个答案:

答案 0 :(得分:0)

循环遍历排序的数组,计算每个字符串与目标字符串之间的Levenshtein distance,如果它足够小,则返回。

什么构成“足够小”取决于你。你可能不得不做一些测试。

答案 1 :(得分:0)

只需遍历数组中的每个元素并将其与输入进行比较,确定输入是否包含在元素中。删除任何不符合此先决条件的元素。最后浏览剩余的元素,然后按字母顺序选择一个元素。

答案 2 :(得分:0)

循环遍历数组的所有索引值,并找到输入的子字符串匹配。找到所有匹配并打印索引值最低的那个。

例如,您将找到Array [0]和Array [3]的子字符串匹配。现在您在0和3处有两个匹配项。找到下一个匹配的字母表。在Arrary [0]中,Sta的下一个字母表是'c'但是在Array [3]处,下一个字母表是'k',这里是< k,所以输出是Array [0]

答案 3 :(得分:0)

您可能会发现Trie数据结构很有用。找到你需要的所有单词非常有效。

但如果列表中有很多单词,则内存开销可能很大。

答案 4 :(得分:0)

我会使用List,在该列表上执行binarySearch。

List<String> arr = new ArrayList<>();

添加元素,添加元素时可以执行以下操作。

int x = Collections.binarySearch(arr, key); 
if(x < 0)
    arr.add(-x-1, key);
//for n element this takes n.log_n time.

如果binarySearch的结果是&gt;你可以在列表中进行二进制搜索。 0,然后密钥存在于列表中,否则(-x-1)是密钥插入时的位置。 go tru以输入字符串开头的每个元素。

例如,arr是您的数组,您正在搜索输入。

arr = {"Flow", "Over", "Stack",  "Stake"}
input = "Sta";

int x = Collections.binarySearch(arr, input);
if(x < 0)
    x = -x-1;

if(arr.get(x).subString(0,input.length()).equals(input));
    System.out.println(arr.get(x))
else 
    System.out.println("there is no element starting with input string");

时间复杂度为O(logn),其中n是数组的长度。