【问题标题】:find the length of smallest unique sub strings given 1000 of strings of length 100给定 1000 个长度为 100 的字符串,找到最小的唯一子字符串的长度
【发布时间】:2013-07-28 07:22:31
【问题描述】:

给定 1000 个长度为 100 个字符的字符串。任务是计算每个字符串的最小子字符串的长度,这在1000个字符串生成的所有子字符串中是唯一的。

我的方法

  1. 为每个字符串生成长度为1-100的所有子字符串并存储在map中,如果发现重复的子字符串,则继续增加计数。

  2. 重新生成从长度为1开始的每个字符串的所有子字符串,如果任何一个长度为L的子字符串的计数为1,则输出L。

观察

  1. 此解决方案在 C++ 中获取 TLE,并在 java 中传递。我对此的理解是,stl::map 操作在 log(N) 时间内完成,而 HashMap 操作在 O(1) 时间内完成。

问题

  • 我正在考虑一个解决方案,实现我自己的散列。我面临的问题是 1) 选择适合散列数组大小的值 2) 如何从给定的字符串生成散列以便碰撞可以最多可以避免。

上述问题的任何其他最佳方法都是可观的。

【问题讨论】:

  • std::unordered_map?写一个快速的string_view 类型类来避免所有的内存重复?使用trie?
  • @Yakk:c++ 11的支持在目标平台上没有用。我想过Trie,但是知道Trie中的操作需要O(log N)并且在C++中实现map的事实使用 RBTree,我没有发现使用它的任何优势。您能否解释一下如何实现 string_view 以避免重复。
  • A container_view 是指向其他容器的一对迭代器,标记该视图在其他容器中的开始/结束。 string_view 是一对指向字符串(可能是std::string)的迭代器(可能是指针),允许您使用子字符串而无需复制该子字符串中的字符。与 C 字符串和 std::string 不同,string_view 不是以 null 结尾的,而是在视点的 end 迭代器处结束。 strncmpsize 比较可以让您非常轻松地实现 operator<。在std::map 中查看内容并查看。
  • 有 O(N^2) 个长度为 1 到 N 的子字符串。一个 std::map 为 O(log n),其中 n 是字符串的数量。一个 trie 将是 O(n),其中 n 是最长子串的长度。
  • @brian beuning:得到你的解释,我已经检查了基于 Trie 的解决方案,它在这里工作:)。我相信散列也可以帮助我解决这类问题,让我更多地挖掘它。

标签: c++ string algorithm hash substring


【解决方案1】:
  1. 创建 char* 数组,每个元素都是指向字符串中每个符号的指针。对于您的问题,数组大小为 100x1000 = 100000 char* 指针。 O(N)

  2. 将此数组排序为“按字母顺序排列的字符串”。 O(N*Log(N))

  3. 扫描字符串,并为每个第 [i] 个字符串搜索 max_eq_prefix 在这个字符串和字符串 [i+1] 和 [i-1] 之间。 对于第一个和最后一个字符串运行单个比较,使用 [i+1] 第一个,[i-1] 最后一个。 O(N)

具有最小 max_eq_prefix 的字符串是您的子字符串, 长度为长度(max_eq_prefix) + 1。

找出max_eq_prefix的例子:

i-1:aabala
i:  aabumba
i+1:acron

对于字符串 [i],max_eq_prefix 是 aab。所以,唯一的子串是“aabu”。

如您所见,这是一种极小极大算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-14
    • 2017-01-14
    • 2020-08-19
    • 2011-05-11
    • 2018-07-19
    • 2014-02-02
    • 2013-05-03
    • 1970-01-01
    相关资源
    最近更新 更多