题目如下:
假设一字符串已被预处理,其中出现过的每一字符其出现的位置已被存到已排序列表(sorted list)中,例如
A = "this is a text"
预处理后会得到一下列表:
a : 9
e : 12, 17
h : 2
i : 3, 6
s : 4, 7, 13
t : 1, 11, 14, 16, 19
x : 18
空格 : 5, 8, 10, 15
对任意给定字符串B,请设计一算法找出字符串A中B出现的所有位置,算法复杂度多少?
自己感觉可能利用Hash表才能有效降低复杂度,谁有巧妙地、好的算法,代码贴过来更好了!(C、C++均可)
解答:
这个明显和预处理结果的存储结构栖栖相关
(1)对于字母不区分大小写
如果设计预处理是一个 [0-26) 的数组链表 List *pre_post['Z'-'A'];
那么直接使用0和1位置(A, B字母信息)的链表进行遍历,即可得到结果
算法复杂度跟A,B出现的次数成线性关系,即复杂度为O(N)
(2)区分大小写
设计同上, 一个 [0-52) 的数组链表即可
具体的预处理存储直接影响算法复杂度