这是一次Google面试的问题,现在是Google的基础编程课程中的一个问题。我试图了解以下问题的解决方案:
”给出字符串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个字符,但是我不知道密集向量代表什么?是错误还是我错过了什么?
谢谢。
答案 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 )。