C++ 在给定1000个长度为100的字符串的情况下,查找最小的唯一子字符串的长度
给定长度为100个字符的1000个字符串。任务是为每个字符串计算最小子字符串的长度,该长度在1000个字符串生成的所有子字符串中是唯一的 我的方法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)
- 我正在考虑一个解决方案,实现我自己的哈希。我面临的问题是1)选择哈希数组大小的适当值2)如何从给定字符串生成哈希,这样最多可以避免冲突
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的解决方案,它在这里工作:)。我相信散列也能帮助我解决这类问题,让我更深入地挖掘它。