Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在给定1000个长度为100的字符串的情况下,查找最小的唯一子字符串的长度_C++_String_Algorithm_Hash_Substring - Fatal编程技术网

C++ 在给定1000个长度为100的字符串的情况下,查找最小的唯一子字符串的长度

C++ 在给定1000个长度为100的字符串的情况下,查找最小的唯一子字符串的长度,c++,string,algorithm,hash,substring,C++,String,Algorithm,Hash,Substring,给定长度为100个字符的1000个字符串。任务是为每个字符串计算最小子字符串的长度,该长度在1000个字符串生成的所有子字符串中是唯一的 我的方法 为每个字符串生成长度为1-100的所有子字符串,并将其存储在映射中,如果发现重复的子字符串,则继续增加计数 从长度1开始为每个字符串重新生成所有子字符串,如果长度L的任何子字符串的计数为1,则输出L 观察 该解决方案在C++中得到TLE,并在java中传递。我的理解是,stl::map操作是在log(N)时间内完成的,而HashMap操作是在O(1)

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

我的方法
  • 为每个字符串生成长度为1-100的所有子字符串,并将其存储在映射中,如果发现重复的子字符串,则继续增加计数

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

  • 观察 该解决方案在C++中得到TLE,并在java中传递。我的理解是,stl::map操作是在log(N)时间内完成的,而HashMap操作是在O(1)时间内完成的 问题
    • 我正在考虑一个解决方案,实现我自己的哈希。我面临的问题是1)选择哈希数组大小的适当值2)如何从给定字符串生成哈希,这样最多可以避免冲突
    上述问题的任何其他最优方法都是值得注意的

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

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

  • 扫描字符串,并为每个[i]-th字符串搜索max\u eq\u前缀 在该字符串与字符串[i+1]和[i-1]之间。 对于第一个和最后一个字符串,使用[i+1]运行单个比较 第一个,最后一个。O(N)

  • 带有最小max_eq_前缀的字符串是您的子字符串, 长度是长度(最大相等前缀)+1

    计算max_eq_前缀的示例:

    i-1:aabala
    i:  aabumba
    i+1:acron
    
    对于字符串[i],max_eq_前缀为aab。所以,唯一的子字符串是“aabu”


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

    std::无序映射
    ?编写一个快速的
    string\u视图
    type类以避免所有内存重复?使用<代码> TIE < /Cord>?@ YAKK:C++ 11的支持在目标平台上没有用。我想到TIE,但是知道TIE中的操作采用O(log n)和在C++中映射是用RBTURE实现的,我没有发现使用它的任何好处。请解释如何实现字符串视图以避免重复。容器视图是指向其他容器的一对迭代器,标记此视图指向其他容器的开始/结束。
    string\u视图
    是一对进入字符串(可能是
    std::string
    )的迭代器(可能是指针),允许您使用子字符串,而无需创建该子字符串中字符的新副本。与C字符串和
    std::string
    不同,
    string\u视图
    不是以null结尾的,而是在视图的
    end
    迭代器指向的地方结束
    strncmp
    size
    比较一起,可以实现
    运算符。有O(N^2)个长度为1到N的子字符串。带有be O(log N)的std::map,其中N是字符串数。trie将是O(n),其中n是最长子字符串的长度。@brian beuning:我已经检查了基于trie的解决方案,它在这里工作:)。我相信散列也能帮助我解决这类问题,让我更深入地挖掘它。