我需要一个算法来搜索数组中的字符串,但字符串可能与数组中的某个项目不完全相同。 例如,
Array = {"Stack", "Over", "Flow", "Stake"}
input = "Sta"
需要识别Stack和Stake都匹配参数,然后选择按字母顺序排在第一位的参数。 我怎么能这样做?
答案 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是数组的长度。