找到1000个长度为100的字符串的最小唯一子字符串的长度

时间:2013-07-28 12:27:26

标签: c++ string algorithm hash substring

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

我的方法

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

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

  3. 观察

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

    找出max_eq_prefix的例子:

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

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

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