给定一个长度为l
的正确单词列表和一个长度l
为 的不正确单词列表,通过交换两个连续字母,找到与正确单词列表不同的错误单词列表中的单词。这些词被认为是错别字。例如,hte
被认为是拼写错误的the
whilehet
不被视为拼写错误。
什么是最省时的算法,可以让我们找到这个定义被认为是拼写错误的单词列表?
我被告知该列表可以在线性时间内计算,但我无法在线性时间内找到解决方案。我能想到的唯一方法是将一个列表中的所有字母与另一个列表进行比较。
L - list of correct words of size n.
L'- list of incorrect words of size m.
H - hash table
R - result set
1. for each word w in L :
1.1 for each typo t of w : //there are l-1 typos
1.1.1 insert t into H
2. for each word w' in L' :
2.1 if w' in H insert w' in R
3. return R
时间复杂度:
O(n*l)+O(m) = O(max(n*l,m))
空间复杂度:
O(n*l)
假设每个“拼写错误”的单词中只能有一个交换:
从一个空的 HashTable H 开始。
对于 INCORRECT 单词列表中的每个单词 K:
现在对于正确单词列表中的每个单词 C,:
由于 l 是一个固定数字(它必须是,否则你可以同时将 l 和 n 增长到无穷大,否则没有线性时间算法),你有以下运行时复杂性:
因此这是 O(n) 运行时间。
findTypos(List CORRECT_LIST,
List INCORRECT_LIST,
List TYPOS_OUTPUT_LIST) {
boolean INCORRECT_LIST_EMPTY = false
for each element in CORRECT_LIST {
TYPOS = computeTypos(element)
for each typo in TYPOS
if(INCORRECT_LIST.contains(typo)) {
INCORRECT_LIST.remove(typo)
TYPOS_OUTPUT_LIST.add(typo)
}
if(INCORRECT_LIST.size() == 0) {
INCORRECT_LIST_EMPTY = true;
break;
}
}
if(INCORRECT_LIST_EMPTY) {
break;
}
}
return TYPOS_OUTPUT_LIST;
}
这是单一交换案例的解决方案。我假设每个单词只有一个交换。因此,对于 word algorithm
,algo[ir]thm
是一个有效的错字;而[la]go[ir]thm
无效。
让我们调用正确的单词列表A
和另一个列表B
。
HB
B
Σ(a i *10 i ); 其中 0 <= i < a.length,a i = 索引 i 处字符的 int 值这是
O(l)
.2.迭代A
。
(假设 base 1 索引) 错字= [] 对于 i = 1 到 A.length 对于 j = A[i].length 到 2 临时 = 交换(A[i],j,j-1) 哈希 = getHash(temp) 如果( HB .has(哈希)) 错字。添加(临时) 返回错字
你看到两个循环了吗?他们执行多少次?让我们做数学
a 1 .length + a 2 .length + .. + al .length - l (减号是因为我们实际上在每个单词中都少了一个) = length_of_all_characters_the_list_A - l
但是我如何获得订单?嗯,大 O 是上边界,所以
O(l*max(A[i].length) => O(l*m)