我的大学已经过去所以我已经开始准备面试以获得工作,我在准备面试时遇到了这个面试问题
- 您有一组10000个ascii字符串(从文件加载)
- 从stdin输入字符串。
- 写一个伪代码,该伪代码返回(到stdout)(1)中包含相同不同字符(不论顺序)的字符串子集 在(2)中输入。优化时间。
- 假设需要重复调用此函数。初始化字符串数组一次并存储在内存中是可以的。 请避免需要循环遍历所有10000个字符串的解决方案。
醇>
任何人都可以为我提供一般伪码/算法的方法如何解决这个问题?我正在考虑解决方案。我大多熟悉Java。
答案 0 :(得分:6)
这是一个O(1)算法!
初始化:
搜索:
答案 1 :(得分:0)
他们说优化时间,所以我想我们可以安全地滥用空间。
在这种情况下,您可以对10000个字符串进行初始传递,并构建从10000中存在的每个唯一字符到其索引(而不是它们的索引集)的映射。那样你可以问问题的映射,哪些集包含字符'x'?将此映射称为M> (顺序:O(nm),当n是字符串数,m是它们的最大长度)
要及时优化,可以将stdin输入字符串减少为唯一字符,并将它们放入队列中,Q。(顺序O(p),p是输入字符串的长度)
开始一个新的不相交集,比如S.然后让S = Q.extractNextItem。
现在,您可以遍历其余的唯一字符,并找到包含所有这些字符集的集合。
while(Q不为空)(循环O(p)){
S = S与Q.extractNextItem相交(接近O(1),具体取决于您对不相交集的实现)
}
瞧,回来吧。总时间:O(mn + p + p * 1)= O(mn + p)
(这里仍然很早,我希望时间分析是正确的)
答案 2 :(得分:0)
正如波西米亚人所说,树木绝对是必经之路!
这听起来像地址簿查找在手机上的工作方式。开始打孔数字,然后根据数字表示以及数字代表的三个(或实际上更多,如果使用国际字符)字母中的任何一个来过滤地址簿。