在采访的第3步中,这是一个模式匹配问题(我认为它可能是KMP的输出敏感版本,不确定。也无法解决问题。)
与往常一样,我们有一个文本T,但这次它包含来自t_1,...,t_2k的字符,而P是来自p1,...,pk的模式。
它们都来自具有1,...,k符号的相同字母。但并非所有符号都需要出现在文本或模式中。
如果我们知道在模式P中没有出现n次字母符号超过n次,找到O(kn)算法来构造长度为k + 1的向量C,其中C [i]是P的位置数。同意ti ... ti + k-1。
有什么想法吗?
答案 0 :(得分:0)
这更简单 - 看看复杂性 - O(kn) - 这意味着蛮力:
要计算C [i],只需在盯着位置0的模式上和在位置i开始的文本上同时迭代并计算匹配。还行吧)。 因此,计算整个C需要n倍,所以O(nk)。
答案 1 :(得分:0)
C [i]是T [i + j] = P [j]的位置的数量,其中j是沿着图案的偏移。创建这个的显而易见的方法是在文本中的每个位置重复扫描,将P [j]与T [i + j]匹配,但实际上您只需要考虑模式中您知道与当前位置匹配的位置文本字符,你可以在移动文本之前处理任何特定文本位置所贡献的C [i]的所有值,
为P中的每个字符创建一个HashMap,保存它出现的位置列表。对于文本中的每个字符,在HashMap中查找,并递增C [i - j],其中位置j依次是该字符在模式中出现的偏移量。