【发布时间】:2013-05-10 05:11:06
【问题描述】:
我需要一种算法,它会在数组中搜索字符串,但字符串可能与数组中的一项不完全相同。 例如,
Array = {"Stack", "Over", "Flow", "Stake"}
input = "Sta"
它需要识别 Stack 和 Stake 都匹配参数,然后选择按字母顺序排列的第一个。 我该怎么做?
【问题讨论】:
我需要一种算法,它会在数组中搜索字符串,但字符串可能与数组中的一项不完全相同。 例如,
Array = {"Stack", "Over", "Flow", "Stake"}
input = "Sta"
它需要识别 Stack 和 Stake 都匹配参数,然后选择按字母顺序排列的第一个。 我该怎么做?
【问题讨论】:
我会使用 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的结果>0,那么key存在于你的list中,否则(-x-1)是key插入时的位置。 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 是数组的长度。
【讨论】:
遍历排序后的数组,计算每个字符串与目标字符串之间的Levenshtein distance,如果足够小,则返回。
什么是“足够小”取决于您。您可能需要进行一些测试。
【讨论】:
只需循环遍历数组中的每个元素并将其与输入进行比较,确定输入是否包含在元素中。删除任何不满足此先决条件的元素。最后遍历剩余的元素并选择按字母顺序排在第一位的元素。
【讨论】:
遍历数组的所有索引值并找到输入的子字符串匹配。找到所有匹配项并打印索引值最低的匹配项。
例如,您会发现 Array[0] 和 Array[3] 的子字符串匹配。现在您在 0 和 3 处有两个匹配项。找到子匹配项的下一个字母。在 Arrary[0] 下一个到 Sta 的字母是“c”,但在 Array[3] 下一个字母是“k”,这里是 a
【讨论】:
您可能会发现Trie 数据结构很有用。找到您需要的所有单词非常有效。
但如果列表中有很多单词,内存开销可能会很大。
【讨论】: