【问题标题】:Find first distinct string查找第一个不同的字符串
【发布时间】:2023-03-10 06:51:01
【问题描述】:

我正在面试实习。面试官问了以下问题。

给定一个字符串流,找到第一个不同的字符串(流中不重复)。

例如:"abc","xyz","abcd","abc"

ans 是 "abc","abc","abc","xyz"

我用map和sets告诉了这个方法,但是时间复杂度是O(nlogn),假设String的哈希值是O(1)计算的。他不断强调要做得更好,并告诉他预期的复杂度是 O(n)。我想不出解决办法,被拒绝了。请帮我一个方法。

【问题讨论】:

  • 我在想特里和谷歌出现了这个:Count of distinct substrings of a string using Suffix Trie
  • 那么使用 LinkedHashSet 怎么样,它将保持元素的插入顺序,并且检查包含和添加将是恒定的。所以复杂度是 O(n)
  • @Thomas 我不认为他希望我知道后缀 trie。可能有简单的方法。
  • @Ajris 地图的复杂度在最坏的情况下是 O(n)。添加不是 O(1)。
  • 好吧,我想你说的是set。这完全取决于您是实现自己的 equals 和 hashcode 方法还是依赖于已经实现的方法。你通常不会说它的O(n),它的O(1),它优化了很多,所以大多数时候你不用担心它会上升到O(n),尤其是在这个

标签: string


【解决方案1】:

可以用trie和queue解决。

for string in text:
    if string not in trie:
        insert_in_trie(string)
        insert_in_queue(string)
    else:
        if not queue.empty():
            queue.pop()

    if queue.empty():
        print("No distinct character")
    else:
        print(queue.front())

总体复杂度将 O(字符串的总长度),因为插入、删除和查看队列和 trie 将是 O(字符串长度)。

【讨论】:

  • 我认为这种方法行不通。考虑示例:“abc”、“123”、“abc”。我们可以通过在 trie 的叶节点保持字符串的频率来修改您的方法。如果(字符串的频率大于一个)不要推入队列,否则推入队列。现在进行查询,通过转到该叶节点检查队列中第一个字符串的频率。如果它不止一个(从队列中轮询),则打印该字符串。这将在摊销 O(n+length of strings) 中起作用,其中 n 是字符串的数量,但我们不能说查询可以在 O(1) 中完成。
猜你喜欢
  • 2011-11-20
  • 1970-01-01
  • 2018-01-19
  • 2011-01-18
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多