【发布时间】:2013-07-28 07:22:31
【问题描述】:
给定 1000 个长度为 100 个字符的字符串。任务是计算每个字符串的最小子字符串的长度,这在1000个字符串生成的所有子字符串中是唯一的。
我的方法
为每个字符串生成长度为1-100的所有子字符串并存储在map中,如果发现重复的子字符串,则继续增加计数。
重新生成从长度为1开始的每个字符串的所有子字符串,如果任何一个长度为L的子字符串的计数为1,则输出L。
观察
- 此解决方案在 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迭代器处结束。strncmp和size比较可以让您非常轻松地实现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