查找字典中最长的单词,该单词是给定字符串的子序列(Google TechDevGuide)

时间:2018-08-07 17:22:08

标签: algorithm data-structures

这是一次Google面试的问题,现在是Google的基础编程课程中的一个问题。我试图了解以下问题的解决方案:

https://techdevguide.withgoogle.com/paths/foundational/find-longest-word-in-dictionary-that-subsequence-of-given-string#code-challenge

”给出字符串S和一组单词D,找到D中最长的单词,它是S的子序列。 如果可以从S删除一些字符(可能为零)以形成W,而无需重新排列其余字符,则单词W是S的子序列。 注意:D可以任何格式显示(列表,哈希表,前缀树等)。 例如,假设输入S =“ abppplee”和D = {“ able”,“ ale”,“ apple”,“ bale”,“ kangaroo”},则正确的输出应为“ apple”“ < / p>

因此,我主要的疑问是在为小字母指定最佳方法O(N + L)的部分中。在以前的方法中,即O(N + L log N),作者构建了一个哈希表映射字符-> String中的排序索引

因此,对于“充实”,哈希表为:

a -> [0]
b -> [1]
p -> [2,3,4]
l -> [5]
e -> [6]

在小字母的最佳方法中,提到了使用密集的矢量表示代替上面的稀疏矢量表示。

p -> [2, 2, 3, 4, -1, -1, -1, -1]

他们试图代表什么?字符串S =“ abppplee”确实有8个字符,但是我不知道密集向量代表什么?是错误还是我错过了什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

据我所知,此向量应解决该问题(Y设置为字符 p

  

鉴于我的最后一个匹配字符在索引X处,而下一个字符   要匹配的是Y,该匹配在哪里发生?

换句话说,如果您在原始字符串的索引i处,向量p[i]的元素会告诉您在字符串中最接近的下一个字符 p 的位置字符串。

更具体地说,原始字符串为s=abppplee,我们要验证:

p -> [2, 2, 3, 4, -1, -1, -1, -1]

这意味着如果我们在索引0处,最接近的 p 在索引2处。对于索引1,最接近的 p 也位于2。如果我们位于索引2,则最接近的下一个 p 位于位置3,依此类推。值-1表示没有 p < / em>在字符串的其余部分(例如,在位置4处,其余字符确实只是lee,因此没有 p )。